2010-04-13 18 views
6

Actualicé mi proyecto a ASP.NET 4 RTM con ASP.NET MVC 2.0 RTM en la actualidad.Parámetros de ruta opcionales en ASP.NET 4 RTM ya no funcionan como antes

Anteriormente estaba usando ASP.NET 3.5 con ASP.NET MVC 2.0 RTM.

Algunas de mis rutas no funcionan de repente y no sé por qué. No estoy seguro de si algo cambió entre 3.5 y 4.0, o si esto fue un problema de tipo de regresión en el 4.0 RTM. (Nunca antes probé mi aplicación con 4.0).

Me gusta usar Url.RouteUrl("route-name", routeParams) para evitar ambigüedades al generar URL. Aquí está mi definición de ruta para una página de galería. Quiero que imageID sea opcional (se obtiene una página de miniaturas si no se especifica).

// gallery id 
routes.MapRoute(
    "gallery-route", 
    "gallery/{galleryID}/{imageID}/{title}", 
    new { controller = "Gallery", action = "Index", 
      galleryID = (string) null, 
      imageID = (string) null, 
      title = (string) null} 
); 

En .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 

En .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 

Anteriormente I podría suministrar solo el galleryID y todo lo demás se ignorarían en la URL generada. Pero ahora parece que necesito especificar todos los parámetros hasta title - o se da por vencido al determinar la URL.

URL entrantes funcionan bien para /gallery/cats y que está asignado correctamente a través de esta regla con imageID y title tanto se le asigna null en mi controlador.

También probé las rutas de INCOMING con http://haacked.com/archive/2008/03/13/url-routing-debugger.aspx y todas funcionan bien.

+0

Si alguien puede probar esto en .NET 4 RC Yo agradecería mucho. Solo tengo una máquina :-( –

Respuesta

5

La forma correcta de especificar parámetros opcionales en ASP.NET MVC 2.0 está utilizando el campo UrlParameter.Optional:

routes.MapRoute(
    "gallery-route", 
    "gallery/{galleryID}/{imageID}/{title}", 
    new 
    { 
     controller = "Gallery", 
     action = "Index", 
     galleryID = UrlParameter.Optional, 
     imageID = UrlParameter.Optional, 
     title = UrlParameter.Optional 
    } 
); 

Suponiendo que la siguiente controlador y la acción:

public class GalleryController : Controller 
{ 
    public ActionResult Index(string galleryID, string imageID, string title) 
    { 
     return View(); 
    } 
} 

Todo esto funciona como se espera :

<%= 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" })%> 

Renderizar como:

/gallery/cats 
/gallery/cats/4 
/gallery/cats/4/tiddles 

Observación: Probado en Windows 7 x64, Visual Studio 2010 RTM, proyecto ASP.NET MVC 2.0.

+0

¿era esto un proyecto de estructura 3.5 o 4.0? Algo cambió con certeza porque no cambié la versión de mvc. Y de hecho pensé que ya había probado con opciones opcionales pero en realidad hice que renderizara UrlParameter. Opcional a la URL de salida. Gracias por probarlo. Le daré otra oportunidad –

+0

Era un 4.0 Proyecto de marco que creé usando la plantilla de Visual Studio. –

Cuestiones relacionadas