MVC MapPageRoute y ActionLink

He creado una ruta de página para poder integrar mi aplicación MVC con algunas páginas de formularios web que existen en mi proyecto:

public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); // register the report routes routes.MapPageRoute("ReportTest", "reports/test", "~/WebForms/Test.aspx" ); routes.MapRoute( "Default", // Route name "{controller}/{action}/{id}", // URL with parameters new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); } 

Esto ha creado un problema cada vez que uso Html.ActionLink en mis Vistas:

  

Cuando carga la página en el navegador, el enlace aparece como:

 http://localhost:12345/reports/test?action=Index&controller=Home 

¿Alguien se ha topado con esto antes? ¿Cómo puedo arreglar esto?

Supongo que es necesario agregar algunas opciones de parámetros a la statement MapPageRoute . Entonces, si tiene más de una página de formularios web en el directorio de WebForms , esto funciona bien.

 routes.MapPageRoute ("ReportTest", "reports/{pagename}", "~/WebForms/{pagename}.aspx"); 

PD: También puede querer echar un vistazo a la propiedad RouteCollection de RouteCollection

Una alternativa sería utilizar

 <%=Html.RouteLink("Home","Default", new {controller = "Home", action = "Index"})%> 

Acabo de tener un problema muy similar. Mi solución fue dar al sistema de enrutamiento una razón para rechazar la ruta de la página cuando se buscan coincidencias para el ActionLink.

Específicamente, puede ver en la URL generada que ActionLink crea dos parámetros: controlador y acción. Podemos usarlos como un método para hacer que nuestras rutas “estándar” (~ / controller / action / id) no coincidan con la ruta de la página.

Al reemplazar los “informes” estáticos en la ruta de la página con un parámetro que llamaremos “controlador” y luego agregar una restricción de que el “controlador” debe ser “informes” obtenemos la misma ruta de la página para nuestros informes, pero rechazamos cualquier cosa con un parámetro de controlador que no es “informes”.

 public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); // register the report routes // the second RouteValueDictionary sets the constraint that {controller} = "reports" routes.MapPageRoute("ReportTest", "{controller}/test", "~/WebForms/test.aspx", false, new RouteValueDictionary(), new RouteValueDictionary { { "controller", "reports"} }); routes.MapRoute( "Default", // Route name "{controller}/{action}/{id}", // URL with parameters new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); }