2013-03-15 13 views
10

stato a guardare per un po ', e si sentono come sto solo di essere stupido vuole ottenere alcuni più occhi su di esso ..Url.Action con RouteValueDictionary con protocollo

ho bisogno di generare un URL completo, (ad esempio, http://www.domain.com/controller/action?a=1&b=2), in genere mi basta usare Url.Action per fare questo senza alcun problema specificando il protocollo:

var url = Url.Action("Action", "Controller", new { a = 1, b = 2 }, "http"); 

ho iniziato a mettere insieme una classe che restituisce un RouteValueDictionary per rendere questi oggetti anonimi scompaiono. Tuttavia, non riesco a farlo funzionare a fianco dell'aiuto.

var x = Url.Action("Action", "Controller", new RouteValueDictionary(new { a = 1, b = 2 }), "http"); 
// "http://127.0.0.1/Controller/Action?Count=2&Keys=System.Collections.Generic.Dictionary%602%2BKeyCollection%5BSystem.String%2CSystem.Object%5D&Values=System.Collections.Generic.Dictionary%602%2BValueCollection%5BSystem.String%2CSystem.Object%5D", 

var y = Url.Action("Action", "Controller", new { a = 1, b = 2 }, "http"); 
// "http://127.0.0.1/Controller/Action?a=1&b=2" 

Tutti gli indicatori che portano ad un facepalm molto apprezzato :)

Aggiornamento:

E 'probabilmente meglio chiarire che nel campione di cui sopra, ho bisogno di ottenere la variabile 'X' funziona correttamente, dal momento che RouteValueDictionary viene creato altrove nel codice. Supponiamo che RouteValueDictionary sia corretto.

Non capisco perché questo funziona con oggetti anonimi, ma lo stesso oggetto avvolto nello stesso oggetto avvolto in un RouteValueDictionary fa impazzire l'helper.

+0

Come si sta creando il RouteValueDictionary? – Oliver

risposta

4

Il sovraccarico in uso prevede il tipo "oggetto" per il parametro su cui si sta passando RouteValueDictionary. Per qualche motivo questo causa il problema, forse qualcosa a che fare con .ToString()? Utilizzare un sovraccarico che accetta un RouteValueDictionary e questo dovrebbe funzionare.

Per verificare ciò, aggiungere un argomento hostname per selezionare il sovraccarico illustrato di seguito:

Correct overload

EDIT

Si potrebbe usare questa estensione nel progetto per aggiungere il sovraccarico di cui avete bisogno a Url.Azione. Internamente risolverà e aggiungerà l'hostName dalla richiesta.

public static string Action 
    (this UrlHelper helper, string action, 
    string controller, RouteValueDictionary routeValues, string protocol) 
{ 
    string hostName = helper.RequestContext.HttpContext.Request.Url.Host; 
    return helper.Action(action, controller, routeValues, protocol, hostName); 
} 
+0

Grazie, ma sfortunatamente questo non mi aiuta - poiché la creazione dell'oggetto anonimo è ancora in linea - questa è stata spostata altrove per rimuovere la duplicazione. Devo sapere perché la variabile "X" nella domanda è sbagliata. –

+0

La creazione dell'oggetto anonimo è in linea nel tuo esempio x? Hai omesso la chiamata al metodo che stai utilizzando? – Oliver

+0

Ho aggiornato per chiarire: la variabile 'X' sta usando un RouteValueDictionary - supponiamo che sia stato creato altrove nel codice. È solo per fare un semplice ripro-caso. –

12

È interessante notare, sembra che il tuo esempio specifico è la corrispondenza di una firma del metodo che prende "oggetto" come una proprietà, piuttosto che RouteValueDictionary. Come tale, è solo toString() ing il typename, piuttosto che correttamente la serializzazione di un RouteValueDictionary

var x = Url.Action("Index", "Home", new RouteValueDictionary(new { a = 1, b = 2 }), "http", string.Empty); 

Nota "string.Empty" alla fine.

Questo è sufficiente per forzare il codice a utilizzare un sovraccarico diverso, che accetta un RouteValueDictionary e come tale, serializza correttamente.

// http://localhost:55110/?a=1&b=2 
+1

Il sovraccarico che sta usando è in attesa di un oggetto mentre la maggior parte degli altri overload si aspetta un RouteValueDictionary, vedere la mia risposta – Oliver

+0

È interessante notare che è anche possibile aggiungere una stringa.Empty come parametro host per ottieni l'output che stai cercando. – DavidWhitney

+0

OK, questo mi ha davvero confuso, la stringa.Empty funziona ed è * leggermente * migliore di dover premere 'RequestContext' ogni volta. –

Problemi correlati