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

原文 标签 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") %>


该链接仅指向同一页面。我需要添加新路线还是修改现有路线?任何帮助,不胜感激。

谢谢。

最佳答案

默认路由应始终显示在最后,并且是全部路由。它会自动捕获等于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
    );
}

相关文章:

c# - 重新加载回发下拉菜单

c# - 使用带有日期时间和布尔值的自动映射器来表示POCO中的半天

c# - MVC 3自定义路由处理程序-跳至下一个自定义路由规则?

c# - 使用参数调用委托方法名称

c# - 经过身份验证的WCF服务,适用于MonoTouch,Mono适用于Android和WP7

asp.net-mvc-3 - System.Web.Mvc.MvcHandler.ProcessAsyncRequest()是什么方法?

asp.net - 如何对使用HostingEnvironment.MapPath的代码进行单元测试

asp.net - ASP.NET MVC 3路由约束:不为null的正则表达式

iis-7 - System.Web.Routing处于活动状态时,为什么反向代理重写规则停止工作?

c# - 如何在设计时在.net,winforms中向库的最终用户提供应用程序设置