2010-12-14 24 views
9

He creado una ruta de la página para que pueda integrar mi aplicación MVC con unas pocas páginas WebForms que existen en mi proyecto:MVC MapPageRoute y ActionLink

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 en Html.ActionLink Mis puntos de vista:

<%: Html.ActionLink("Home", "Index", "Home") %> 

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

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

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

Respuesta

5

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

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

PS: También puede que desee echar un vistazo a la propiedad RouteExistingFiles de RouteCollection

Una alternativa sería utilizar

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

Gracias. Quería evitar el uso de RouteLink solo por brevedad, pero podría tener que terminar usándolo. Simplemente no entiendo por qué la ruta de la página se combina con mis rutas regulares cuando uso ActionLink. – Dismissile

5

solo tuve un problema muy similar. Mi solución fue dar al sistema de enrutamiento un motivo para rechazar la ruta de la página cuando busco coincidencias para ActionLink.

En concreto, 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 agregamos una restricción de que el "controlador" debe ser "informes" obtenemos la misma ruta de página para nuestros informes, pero rechaza cualquier cosa con un parámetro de controlador que no sea "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 } 
    ); 
} 
Cuestiones relacionadas