2013-07-22 257 views
4

我想创建简单的博客引擎。对于花哨和干净的网址,我想使用在MVC4中实现的路由机制。ASP.NET 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。

我收到的全部是 '/'应用程序中的服务器错误。 找不到资源。

出了什么问题?

+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. 在上面的示例中,使用约束或硬编码路由会产生相同的结果。约束更灵活,因为你可以使用正则表达式来限制你的路由所用的控制器/动作/参数值。例如,如果您添加使用/分类/页模式你就可以相应地修改控制器约束的新路线:

    限制:新 { 控制器= @“^(文章| AnotherController)$” }

0

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

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

通过向route参数添加问号很容易使URI参数成为可选项。我们也可以使用form parameter = value指定一个默认值。 here是完整的文章。