2014-02-23 166 views
0

我需要有一個自定義路由,如默認的,但這個應該接受數值作爲字符串。像0015.如果我離開參數類型爲INT,傳遞給控制器​​方法的價值會被截斷到15我需要0015. 所以我做什麼,我創建了以下內容:MVC 4自定義路由str和int

 routes.MapRoute(
      name: "AccRef", 
      url: "{controller}/{action}/{acc_ref}", 
      defaults: new { controller = "Company", action = "Index", acc_ref = "" }, 
      constraints: new { acc_ref = @"^\d{1,4}$" } 
     ); 
     routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Home", action = "Index", id =  UrlParameter.Optional } 
     ); 

而且問題是,據我瞭解,當我現在在整數關口的「ID」

@Url.Action("Method", "Controller", new { id = item.ref}) 

從視圖中,路由仍然適用第一路線,並調用失敗。

你會如何解決路由問題? 有可能有兩個相同的路由配置,其中一個接受int和另一個字符串?

+0

你能否進一步解釋一下你的期望,以及實際是什麼?即顯示一些鏈接輸出,還是請求路由失敗 –

+0

當我嘗試調用第二種配置方法類型時,這是配置失敗的路由。我用Url.Action描述了一個調用,接受一個操作(int id),但它失敗了。 – elector

+0

我真的不明白你想要做什麼。標準路由不關心它是字符串還是int。您只需在您的操作方法中設置參數類型。那麼,爲什麼不改變你的動作方法來接受一個字符串而不是一個int,它就會工作。 –

回答

1

您的AccRef過於貪婪。

如果你看一下從URL幫手它是生成的URL:

控制器/方法/ ID

這是你第一次AccRef路線以及默認路由匹配。

你必須對你的路線更具體。您定義路線的順序也很重要。所以你通常最後要定義貪婪路線。

Phil Haack在nuget上有一個路由調試器(博客文章here),它可以幫助您識別路由問題。

+0

+1,並指出正確的原因。我只是增加了一些細節。 – SBirthare

0

如果顛倒像這樣的順序:

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

     routes.MapRoute(
      name: "AccRef", 
      url: "{controller}/{action}/{acc_ref}", 
      defaults: new { controller = "Company", action = "Index", acc_ref = "" }, 
      constraints: new { acc_ref = @"^\d{1,4}$" } 
     ); 

您當前的情況下將與上述變化,但「/首頁/索引/ 5」或「/公司/指數/ 0015」仍然符合雙方的URL工作路線。這是因爲路線是通用的(正如Bigfellahull指出的那樣)。

在你的情況,因爲這兩個參數的類型爲int,兩個路由匹配。

選項1:

您可以添加一個額外的字符串說「ACC」的路線網址,使之更加具體。

routes.MapRoute(
     name: "AccRef", 
     url: "{controller}/{action}/{acc}/{acc_ref}", 
     defaults: new { controller = "Company", action = "Index", acc_ref = "" }, 
     constraints: new { acc_ref = @"^\d{1,4}$" } 
    ); 

在這種情況下,網址將更改爲「.Company/Index/acc/0015」。

選項2:

如果你可以改變操作方法的參數類型,像這樣:

public class HomeController : Controller 
    { 
     public ActionResult Index(string id) 
     { 
     } 
    } 

的URL將匹配只有一個路由。

選項1和2僅用於解釋如何使路線更具體。