ASP.NET MVC4自定义路由

时间:2013-07-22 18:47:10

标签: asp.net-mvc-4 asp.net-mvc-routing

我想创建简单的博客引擎。对于花哨而干净的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
                          });
    }
}

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

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。

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

有什么问题?

3 个答案:

答案 0 :(得分: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模式的新路由,则可以相应地修改控制器约束:

    约束:新的         {             controller = @“^(文章| AnotherController)$”         }

答案 1 :(得分:0)

问题是,您在{controller} / {category} / {page}路径中间有一个可选参数。 ASP.NET路由有问题,因为如果没有提供类别,则无法检测到未提供该类别。在路径here的中间有一个可选参数的解决方案。它解决了一个更普遍的问题,但它也涵盖了你的问题。

答案 2 :(得分:0)

要启用属性路由,请在配置期间调用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参数设置为可选。我们还可以使用form parameter = value指定默认值。 here是完整的文章。