ASP.NET MVC 3 - 难以理解路由

时间:2012-01-13 08:49:17

标签: c# asp.net-mvc-3 asp.net-mvc-routing

我使用NerdDinner教程作为基础来创建MVC 3中的系统。我不确定我是否完全理解路由。

一切都运转正常,直到我为我的分页助手添加了一个分类。

这是global.asax.cs

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        "UpcomingKeyDates", // Route name
        "KeyDates.mvc/{sortBy}/Page/{page}", // URL with parameters
        new { controller = "Home", action = "Index" } // Parameter defaults
    );

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

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

}

我想默认列表按首次导航到页面时按事件日期升序排序(工作正常)。排序和分页也很好。但是,当我使用此链接时...

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

链接只是指向同一页面。我是否需要添加新路线或修改现有路线?任何帮助非常感谢。

感谢。

1 个答案:

答案 0 :(得分:1)

默认路线应始终显示在最后,并且是全能路线。它将自动捕获相当于http://yourdomain.com/

的空路线

默认路线应始终采用以下格式

routes.MapRoute(
    "Default", // Route name
    "{controller}/{action}/{id}", // URL with parameters
    new { controller = "foo", action = "bar", id=UrlParameter.Optional }
);

此外,如果页面将是一个数字,您可以使用正则表达式约束它(见下文)。

简而言之,请更改您的Global.asax,使其如下所示:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        "UpcomingKeyDates", // Route name
        "KeyDates.mvc/{sortBy}/Page/{page}", // URL with parameters
        new { controller = "Home", action = "Index" }, // Parameter defaults
        new { page = @"\d+" } // Note I have constrained the page so it has to be an integer...
    );

    routes.MapRoute(
       "MyDefaultRoute", // Your special default which inserts .mvc into every route
       "{controller}.mvc/{action}/{id}", // URL with parameters
       new { controller = "Home", action = "Index", id=UrlParameter.Optional, sortBy = "EventDate" } // Parameter defaults
    );

    routes.MapRoute(
       "Default", // Real default route. Matches any other route not already matched, including ""
       "{controller}/{action}/{id}", // URL with parameters
        new { controller = "Home", action = "Index", id=UrlParameter.Optional, sortBy = "EventDate" } // Parameter defaults
    );
}