ASP.NET MVC no puede encontrar la ruta mediante programación
-
07-07-2019 - |
Pregunta
Tengo la siguiente ruta, registrada en mi global.asax.
routes.MapRoute(
"Home", // Unique name
"", // Root url
new { controller = "Home", action = "Index",
tag = string.Empty, page = 1 }
);
kewl. cuando inicio el sitio, recoge correctamente esta ruta.
Ahora, cuando trato de hacer programáticamente lo siguiente, devuelve NULL.
var pageLinkValueDictionary =
new RouteValueDictionar(linkWithoutPageValuesDictionary)
{{"page", 2}};
VirtualPathData virtualPathData =
RouteTable.Routes.GetVirtualPath(viewContext, "Home"
pageLinkValueDictionary);
// NOTE: pageLinkValueDictionary ==
// Key: Action, Value: Index; Key: page, Value: 2
¿Por qué estaría pasando esto?
¿Tenía la impresión de que encontraría la ruta de inicio pero agregaría algún valor que no se encontrara como elemento de cadena de consulta?
Actualizar
Todavía no hay suerte con esto. Además, usando el MVC RC , ahora necesito cambiar viewContext a veiwContext.RequestContext .. que se compila pero todavía obtengo un resultado nulo.
Actualización 2
Cuando tengo la ruta sin el elemento predeterminado page = 1
, la ruta SE ENCUENTRA .
por ejemplo.
routes.MapRoute(
"Home",
"",
new { controller = "Post", action = "Index", tags = string.Empty }
);
.. y RouteTable.Routes.GetVirtualPath
devuelve una instancia de VirtualPathData
. Cuando agrego la page = 1
(valor predeterminado) de nuevo, la instancia de VirtualPathData
devuelta es nula?
Solución
Bueno, la razón por la que devuelve nulo es porque no hay una ruta con una " página " Datos de ruta.
¿Podría ampliar un poco lo que está tratando de lograr? Si desea redirigir a una página con la url / page / 2 o /? Page = 2, entonces debería usar RedirectToRoute o RedirectToAction:
return RedirectToRoute("IndexDefault", new {page = "2"});
Otros consejos
Creo que tu ruta debería ser así:
route.MapRoute("theRoute", "{controller}/{action}/{tag}/{page}",
new { controller="Post", action="Index", tag="", page=1 });
o (dependiendo de cómo debe verse la URL completa) ...
route.MapRoute("theRoute", "/{tag}/{page}",
new { controller="Post", action="Index", tag="", page=1 });
Esto aún coincidirá con una solicitud para http://mysite.com/ e irá a sus valores de ruta predeterminados definido anteriormente. Pero ahora, cuando especifique una etiqueta o página, obtendrá la URL que desea.
Deberías echar un vistazo a Phil's Route Tester: