2013-07-22 176 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是完整的文章。