2011-08-08 18 views
7

Tengo un enlace en una página que dice así:Url.Action() incluye parámetros deseados, tratando de tener más control

Url.Action("List", "Item", new { category = "seasons" }) 

La ruta que coincide con la página también tiene un parentGroup y los parámetros del grupo

Ej:/Estaciones/Moober/azul/1 ->/{categoría}/{parentGroup}/{grupo}/{id}

El problema es cuando estoy en esa página y el uso de Url.Action, agrega todos los valores de ruta faltantes incluso cuando intento generar un enlace a las categorías solo/{categoría}, aún agregará parentGroup y grupo.

he encontrado this post, que sugiere hacerlo de esta manera:

Url.Action("List", "Item", new { category = "seasons", group = "", parentGroup = "" }) 

Pero no funciona para mí, ya que los elimina de mi url, pero los agrega como parámetros:? /Estaciones parentGroup = Moober & group = Azul

Estoy usando MVC3. ¿Hay alguna manera de forzar a Url.Action() a usar solo los parámetros provistos o cancelar los que no quiero?

Aquí están las rutas.

routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

routes.MapRoute(
    "ItemFromCategoryParentGroupSubGroup", // Route name 
    "{category}/{parentGroup}/{group}/{id}/{language}", // URL with parameters 
    new { controller = "Item", action = "Show", page = 1, language = ConfigurationManager.AppSettings["DefaultLanguage"] }, // Parameter defaults 
    new 
    { 
     category = _validCategory, 
     parentGroup = _validGroup, 
     group = _validChildGroup, 
     id = _validItemInChildGroup 
    } 
); 

routes.MapRoute(
    "ItemListFromParentGroup", // Route name 
    "{category}/{parentGroup}/{group}/{language}", // URL with parameters 
    new { controller = "Item", action = "List", page = 1, language = ConfigurationManager.AppSettings["DefaultLanguage"] }, // Parameter defaults 
    new 
    { 
     category = _validCategory, 
     parentGroup = _validGroup, 
     group = _validChildGroup 
    } 
); 

routes.MapRoute(
    "ItemWithGroup", // Route name 
    "{category}/{group}/{id}/{language}", // URL with parameters 
    new { controller = "Item", action = "Show", page = 1, language = ConfigurationManager.AppSettings["DefaultLanguage"] }, // Parameter defaults 
    new 
    { 
     category = _validCategory, 
     group = _validGroup, 
     id = _validItemInGroup 
    } 
); 

routes.MapRoute(
    "ItemListWithGroup", // Route name 
    "{category}/{group}/{language}", // URL with parameters 
    new { controller = "Item", action = "List", page = 1, language = ConfigurationManager.AppSettings["DefaultLanguage"] }, // Parameter defaults 
    new 
    { 
     category = _validCategory, 
     group = _validGroup 
    } 
); 

routes.MapRoute(
    "ItemListFromCategory", // Route name 
    "{category}/{language}", // URL with parameters 
    new { controller = "Item", action = "List", page = 1, language = ConfigurationManager.AppSettings["DefaultLanguage"] }, // Parameter defaults 
    new 
    { 
     category = _validCategory 
    } 
); 

Editar:

tengo una solución para el momento en que se ve así: Url.RouteUrl ("ItemListFromCategory") básicamente estoy forzando la misma ruta que se supone debe ir acompañada de Url.Action ("Lista", "Artículo", nuevo {category = "seasons"}) Y esta vez no se agregaron parámetros automáticamente.

El problema con esto es que estoy obligado a utilizar rutas con nombre.

+0

¿nos puede mostrar sus rutas? – frennky

+0

Puedo, solo espero que no sean demasiado largos. – Emanuel

Respuesta

0

Intente declarar otros parámetros como UrlParameter.Optional durante el registro de la ruta y establezca el valor predeterminado para esos parámetros en su acción. P.ej.

MyAction(string category, string group = "", parentGroup = 0) 

Espero que esto ayude.

+0

Gracias, lo intenté sin éxito. – Emanuel

3

Cambiar sus rutas

routes.MapRoute(
    "SomeRoute", // Route name 
    "/{category}/{parentGroup}/{group}/{id}", 
    new { 
     controller = "DefaultController", 
     action = "DefaultAction", 
     parentGroup = UrlParameter.Optional 
     group = UrlParameter.Optional 
     id= UrlParameter.Optional 
    } 
); 

Hacer parentGroup, parentGroup, grupo optional.

+0

no se puede tener más de un parámetro opcional, a menos que haga algo como esto: http://haacked.com/archive/2011/02/20/routing-regression-with-two-consecutive-optional-url-parameters .aspx – frennky

+0

He utilizado esta solución provisional http: //weblogs.asp.net/imranbaloch/archive/2010/12/26/routing-issue-in-asp-net-mvc-3-rc-2.aspx para múltiples parámetros opcionales y consecutivos, sin embargo, la url generada sigue siendo la misma al final, Trataré de mezclarlo con la solución propuesta por frennky. – Emanuel

+0

Sí, lamentablemente esto no funcionó. – Emanuel

Cuestiones relacionadas