2008-08-15 16 views
13

Soy nuevo en el enrutamiento MVC (y ASP.Net). Estoy tratando de asignar * .aspx a un controlador llamado PageController.Asignación de rutas MVC de ASP.Net

routes.MapRoute(
    "Page", 
    "{name}.aspx", 
    new { controller = "Page", action = "Index", id = "" } 
); 

No sería el código anterior mapa * .aspx a PageController? Cuando ejecuto este tipo y en cualquier página .aspx me sale el siguiente error:

The controller for path '/Page.aspx' could not be found or it does not implement the IController interface. Parameter name: controllerType

¿Hay algo que no estoy haciendo aquí?

Respuesta

6

I just answered my own question. I had the routes backwards (Default was above page).

Sí, usted tiene que poner todas las rutas personalizadas por encima de la ruta por defecto.

So this brings up the next question... how does the "Default" route match (I assume they use regular expressions here) the "Page" route?

La ruta predeterminada coincide con lo que llamamos Convención sobre configuración. Scott Guthrie lo explica bien en su primera publicación de blog en ASP.NET MVC. Recomiendo que lo leas y también sus otras publicaciones. Tenga en cuenta que estos se publicaron en base al primer CTP y el marco ha cambiado. También puede encontrar web cast en ASP.NET MVC en el sitio asp.net por Scott Hanselman.

0

No estoy seguro de cómo se ve su controlador, el error parece estar apuntando al hecho de que no puede encontrar el controlador. ¿Heredó fuera de Controller después de crear la clase PageController? ¿Está el PageController en el directorio Controladores?

Aquí es mi ruta en los Global.asax.cs

routes.MapRoute(
    "Page", 
    "{Page}.aspx", 
    new { controller = "Page", action = "Index", id = "" } 
); 

Aquí está mi controlador, que se encuentra en la carpeta Controladores:

using System.Web.Mvc; 

namespace MvcApplication1.Controllers 
{ 
    public class PageController : Controller 
    { 
     public void Index() 
     { 
      Response.Write("Page.aspx content."); 
     } 
    } 
} 
6

Me acaba de responder a mi propia pregunta. Tenía las rutas hacia atrás (el valor predeterminado era la página de arriba). Debajo está el orden correcto. Entonces, esto nos lleva a la siguiente pregunta ... ¿cómo se compara la ruta "Predeterminada" (supongo que usan expresiones regulares aquí) la ruta "Página"?

routes.MapRoute(
      "Page", 
      "{Name}.aspx", 
      new { controller = "Page", action = "Display", id = "" } 
     ); 

     routes.MapRoute(
      "Default",            // Route name 
      "{controller}/{action}/{id}",       // URL with parameters 
      new { controller = "Home", action = "Index", id = "" } // Parameter defaults 
     ); 
1

En una de Rob Conery MVC Storefront screencasts, se encuentra con este problema exacto. Es alrededor de los 23 minutos si estás interesado.

0
public class AspxRouteConstraint : IRouteConstraint 
{ 
    #region IRouteConstraint Members 

    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) 
    { 
     return values["aspx"].ToString().EndsWith(".aspx"); 
    } 

    #endregion 
} 

registrar la ruta para todos aspx

routes.MapRoute("all", 
       "{*aspx}",//catch all url 
       new { Controller = "Page", Action = "index" }, 
       new AspxRouteConstraint() //return true when the url is end with ".aspx" 
       ); 

Y se puede probar las rutas por las MvcRouteVisualizer

Cuestiones relacionadas