ASP.NET MVC4自定义路由

5
我希望创建一个简单的博客引擎。为了实现漂亮和干净的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
                          });
    }
}

如果我在网络浏览器的URL中输入:

http://localhost:6666/Articles/SomeCategory/3

我想移动到这个控制器:

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

}

使用参数category =“SomeCategory”和page = 1。 我收到的只是 '/'应用程序中的服务器错误。 找不到该资源。 问题出在哪里?

请问您能否列出所有的路由? - Raciel R.
3个回答

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 }
        );

编辑

我应该在回答中添加这个,但是我很匆忙:

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

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


0
问题是,在您的{controller}/{category}/{page}路径中有一个可选参数。ASP.NET路由对此存在问题,因为如果未提供类别,它无法检测到未提供类别。

-1

要启用属性路由,请在配置期间调用MapMvcAttributeRoutes。以下是代码片段。

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

在MVC5中,我们可以将属性路由与基于约定的路由结合起来。以下是代码片段。
        public static void RegisterRoutes(RouteCollection routes)
         {
          routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
          routes.MapMvcAttributeRoutes();
          routes.MapRoute(
          name: "Default",
          url: "{controller}/{action}/{id}",
          defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
       );
  }

通过在路由参数中添加问号,可以很容易地使URI参数变为可选。我们还可以使用形式参数=值来指定默认值。


ASP.NET MVC 4不支持属性路由。 - Wibisono Indrawan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接