Diciamo che avere un metodo di azione per visualizzare i prodotti in un carrello della spesaCome prevenire Url.RouteUrl (...) di ereditare valori percorso dalla richiesta corrente
// ProductsController.cs
public ActionMethod Index(string gender) {
// get all products for the gender
}
Altrove, in una testa d'albero che è visualizzati in ogni pagina che si sta utilizzando Url.RouteUrl
per creare link HREF ad altre pagine del sito:
<a href="<%= Url.RouteUrl("testimonials-route", new { }) %>" All Testimonials </a>
Questo testimonials-route
è definito nel global.ascx
dal primo percorso di seguito. Si noti che la precedente chiamata a RouteUrl
non fornisce uno gender
, ma il percorso è definito con un valore predefinito di "neutro", pertanto ci si aspetta che venga chiamato Testimonials.Index ("neutro").
routes.MapRoute(
"testimonials-route",
"testimonials/{gender}",
new { controller = "Testimonials", action = "Index", gender = "neutral" },
new { gender = "(men|women|neutral)" }
);
routes.MapRoute(
"products-route",
"products/{gender}",
new { controller = "Products", action = "Index", gender = (string)null },
new { gender = "(men|women|neutral)" }
);
Se qualcuno visita la pagina /products/women
otteniamo un HREF per /testimonials/women
Se qualcuno visita la pagina /products
allora otteniamo un HREF vuoto (la chiamata a RouteUrl restituisce null).
Ma questo non ha senso, vero? testimonials-route
è impostato per default su 'neutral'
per noi se non forniamo un valore di percorso per questo?
Ciò che risulta sta accadendo è che Url.RouteUrl(routeName, routeValues)
estensione aiutante cercherà prima nel suo parametro routeValues
per un valore gender
percorso e se non lo trova in questo dizionario si esaminerà l'URL corrente che siamo sulla (ricorda che Url è un oggetto UrlHelper che ha a disposizione il contesto della richiesta corrente).
Questo ha un effetto possibilmente bello di darci un link a testimonianze maschili se siamo su una pagina di prodotto uomo, ma che probabilmente non è quello che vogliamo se non abbiamo passato un valore nella chiamata RouteUrl
, ed esplicitamente specificato 'neutro' come predefinito nel file global.asax.cs
.
Nel caso in cui abbiamo visitato /products/
, è stato attivato il percorso 'products-route'
e il metodo è stato chiamato. La chiamata a Url.RouteUrl()
eredita effettivamente QUESTO valore nullo per gender
quando stiamo creando un URL utilizzando testimonials-route
. Anche se abbiamo specificato un valore predefinito per gender
in 'testimionials-route
'utilizza ancora questo valore nullo che causa il fallimento dell'itinerario e RouteUrl
restituisce null. [nota: la rotta fallisce perché abbiamo un vincolo su (uomini | donne | neutrali) e null non corrisponde a questo]
In realtà diventa più spaventoso - in quanto "controller" e "azione" possono essere ereditati in allo stesso modo. Ciò può comportare la generazione di URL completamente al controller sbagliato anche quando si chiama RouteUrl (...) con un nome di route esplicito con un controller predefinito.
In questo caso, una volta individuato, è possibile risolverlo facilmente in molti modi, ma in altri casi potrebbe causare un comportamento pericoloso. Questo può essere di progettazione, ma è decisamente spaventoso.
aggiungendo una taglia un anno e mezzo dopo la domanda originale perché (a) mi piacerebbe sapere se il framework ora fa questo per me e (b) sono molto curioso perché questo ha solo 2 upvotes. pensato che sarebbe un problema comune quindi chiedendo se sto facendo qualcosa di sbagliato! –
questo è stato kicking il mio bootie, come il tag {domain} mancava un valore, ma che il sistema dovrebbe fornire automaticamente. Una volta cambiato, ha funzionato. –
perché non chiami semplicemente RenderUrl come: '" '- quindi, niente viene sovrascritto . – Gerwald