0

在我的工作中,我必須解決一個URL重寫問題。我必須使用的URL爲模板:MVC4 Route as/{controler} - {id}而不是/ {controler}/{id}

{controller}/{action}-{id} 

,而不是

{controller}/{action}/{id} 

所以經加工後的URL應該是這樣的:

myController/myAction-128 

,其中128是參數

我路線圖:

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: "NewRoute", // Route name 
       url: "{controller}/{action}-{id}/{extId}", // URL with parameters 
       defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional, extId = UrlParameter.Optional } // Parameter defaults 
      ); 
     } 

控制器代碼:

[HttpGet] 
     public ActionResult DocumentDetails(int? id) 
     { 
      if (doc.HasValue) 
      { 
       ... 
      } 
     } 

這條路線不提供任何成功的結果。我仍然有404錯誤。當我使用/而不是「 - 」時,一切正常,但我的JS視圖環境不起作用。

有什麼我可以做的,以解決這個問題?所有的幫助將不勝感激,謝謝。

回答

4

路線按照您定義的順序進行評估,因此請確保您遵守相同的順序。同時爲id(例如數字)添加約束將有助於路由引擎消除您的路由歧義。更不用說在你的例子中你已經使id標記是可選的,這當然是不可能的,只有路線的最後部分可以是可選的。

所以:

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

    routes.MapRoute(
     name: "NewRoute", 
     url: "{controller}/{action}-{id}/{extId}", 
     defaults: new { controller = "Home", action = "Index", extId = UrlParameter.Optional }, 
     new { id = @"\d+" } 
    ); 

    routes.MapRoute(
     name: "Default", 
     url: "{controller}/{action}/{id}", 
     defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
    ); 
} 
+0

謝謝,這段代碼有效。順便說一句:是@「\ d +」路由中的數字的正則表達式? – 2013-03-24 14:48:31

+1

是的,'\ d +'是一個匹配一個或多個數字的正則表達式。 – 2013-03-24 14:51:35

0

我想你的請求被發現的第一個路由規則,然後動作id被視爲一個整體的行動,而不是被處理。

在默認路線之前設置您的NewRoute。只需移動代碼即可。

+0

謝謝大家,訂單的改變幫了很多忙了;) – 2013-03-24 14:47:43