parametri di percorso opzionali in ASP.NET 4 RTM non funzionare più come prima
-
26-09-2019 - |
Domanda
ho aggiornato il mio progetto per ASP.NET 4 RTM
con ASP.NET MVC 2.0 RTM
oggi.
Sono stato in precedenza usando ASP.NET 3.5
con ASP.NET MVC 2.0 RTM
.
Alcuni dei miei percorsi non funzionano improvvisamente e io non so perché. Non sono sicuro se qualcosa è cambiato tra 3,5 e 4,0 - o se questo era un problema di tipo regressione nella RTM 4.0. (Non ho mai precedentemente provato il mio app con 4.0).
mi piace uso Url.RouteUrl("route-name", routeParams)
per evitare ambiguità nella generazione URL. Ecco la mia definizione della rotta per una pagina della galleria. Voglio imageID
sia facoltativa (si ottiene una pagina di anteprima, se non si specifica di esso).
// gallery id
routes.MapRoute(
"gallery-route",
"gallery/{galleryID}/{imageID}/{title}",
new { controller = "Gallery", action = "Index",
galleryID = (string) null,
imageID = (string) null,
title = (string) null}
);
In .NET 3.5 / ASP.NET 2.0 RTM / IIS7
Url.RouteUrl("gallery-route", new { galleryID = "cats"})
=> /gallery/cats
Url.RouteUrl("gallery-route", new { galleryID = "cats", imageID = "4")
=> /gallery/cats/4
Url.RouteUrl("gallery-route", new { galleryID = "cats", imageID = "4", title = "tiddles")
=> /gallery/cats/4/tiddles
In .NET 4.0 RTM / ASP.NET 2.0 RTM / IIS7
Url.RouteUrl("gallery-route", new { galleryID = "cats"})
=> null
Url.RouteUrl("gallery-route", new { galleryID = "cats", imageID = "4")
=> /gallery/cats/4
Url.RouteUrl("gallery-route", new { galleryID = "cats", imageID = "4", title = "tiddles")
=> /gallery/cats/4/tiddles
In precedenza ho potuto fornire solo il galleryID
e tutto il resto sarebbe ignorato nella URL generato. Ma ora che sta cercando come ho bisogno di specificare tutti i parametri fino title
-. O rinuncia nel determinare l'URL
URL in entrata lavoro bene per /gallery/cats
e mappata correttamente attraverso questa regola con imageID
e title
essendo entrambi null
assegnato nel mio controller.
Ho anche testato i percorsi in entrata con http: // haacked .com / archive / 2008/03/13 / url-routing debugger.aspx e tutti funzionano bene.
Soluzione
Il modo corretto di specificare parametri opzionali in ASP.NET MVC 2.0 utilizza il UrlParameter.Optional campo:
routes.MapRoute(
"gallery-route",
"gallery/{galleryID}/{imageID}/{title}",
new
{
controller = "Gallery",
action = "Index",
galleryID = UrlParameter.Optional,
imageID = UrlParameter.Optional,
title = UrlParameter.Optional
}
);
Supponendo che il controllore e l'azione seguente:
public class GalleryController : Controller
{
public ActionResult Index(string galleryID, string imageID, string title)
{
return View();
}
}
Tutti questi lavori volontà come previsto:
<%= Url.RouteUrl("gallery-route", new { galleryID = "cats" }) %><br/>
<%= Url.RouteUrl("gallery-route", new { galleryID = "cats", imageID = "4"}) %><br/>
<%= Url.RouteUrl("gallery-route", new { galleryID = "cats", imageID = "4", title = "tiddles" })%>
Render come:
/gallery/cats
/gallery/cats/4
/gallery/cats/4/tiddles
Nota:. Testato su Windows 7 x64, Visual Studio 2010 RTM, progetto ASP.NET MVC 2.0
Altri suggerimenti
So che la domanda è per MVC2 ma nel MVC3, la risposta data da Darin Dimitrov fallirà.
Phil Haack ha spiegato il problema e ha dato l'attorno al lavoro nel suo blog: http: // haacked .com / archive / 2011/02/20 / instradamento regressione-con-due-consecutivi-optional-url-parameters.aspx