ASP.NET MVC4自定义路由

Fka*_*Fka 4 asp.net-mvc-routing asp.net-mvc-4

我想创建简单的博客引擎.对于花哨而干净的url,我想使用在MVC4中实现的路由机制.

我在RouteConfig.cs中添加了以下行:

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

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );

        routes.MapRoute(
            name: "ArticleList",
            url: "Articles/{category}/{page}",
            defaults: new
                          {
                              controller = "Articles",
                              category = UrlParameter.Optional,
                              page = 1
                          });
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我在网页浏览器中写道:

http://localhost:6666/Articles/SomeCategory/3
Run Code Online (Sandbox Code Playgroud)

我想转移到这个控制器:

public class ArticlesController : ControllerBase<IHomeService>
{
    public ActionResult Index(string category, int page = 0)
    {
        return View("~/Views/Article/Articles.cshtml");
    }

}
Run Code Online (Sandbox Code Playgroud)

参数category ="SomeCategory"和page = 1.

我收到的只是'/'应用程序中的服务器错误.无法找到该资源.

怎么了?

Rac*_* R. 5

       routes.MapRoute(
            name: "ArticleList",
            url: "{controller}/{category}/{page}",
            defaults: new
            {
                category = UrlParameter.Optional,
                page = 1,
                action = "Index"
            },
            constraints: new
            {
                controller = "Articles"
            }
       );


        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
Run Code Online (Sandbox Code Playgroud)

编辑

我应该把这个添加到答案中,但我很着急:

  1. 首先注册您的自定义路线,自定义路线越多,优先级越高.
  2. 在上面的示例中,使用约束或硬编码路由产生相同的结果.约束更灵活,因为您可以使用正则表达式来限制路由所针对的控制器/操作/参数值.例如,如果添加使用/ category/page模式的新路由,则可以相应地修改控制器约束:

    约束:new {controller = @"^(Articles | AnotherController)$"}