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。

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

怎么了?

4

3 回答 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 模式的新路由,您可以相应地修改控制器约束:

    约束:新 { 控制器 = @"^(Articles|AnotherController)$" }

于 2013-07-22T19:19:04.910 回答
0

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

于 2013-07-26T11:13:23.670 回答
-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 参数成为可选参数。我们还可以使用参数=值的形式指定默认值。

于 2014-09-15T07:05:14.010 回答