2008-11-27 109 views
3

我有以下途徑定義ASP MVC路由與> 1參數

  routes.MapRoute(
      "ItemName", 
      "{controller}/{action}/{projectName}/{name}", 
      new { controller = "Home", action = "Index", name = "", projectName = "" } 
      ); 

這條路線的實際工作,所以如果我在瀏覽器

/Milestone/Edit/Co-Driver/Feature complete 

它正確地去里程碑控制器類型,編輯操作並傳遞值。

不過,如果我嘗試和構建視圖中的鏈接以url.action -

<%=Url.Action("Edit", "Milestone", new {name=m.name, projectName=m.Project.title})%> 

我得到以下網址

Milestone/Edit?name=Feature complete&projectName=Co-Driver 

它仍然有效,但不是很清潔。有任何想法嗎?

回答

5

當構建和ASP.NET路由匹配的路由(這是ASP.NET MVC使用),第一個合適的匹配使用,而不是貪婪,和順序很重要。

所以,如果你有兩個途徑:

"{controller}/{action}/{id}" 
"{controller}/{action}/{projectName}/{name}" 
在給定的順序

,那麼第一個將被使用。額外的值,在這個例子中是projectName和name,成爲查詢參數。

實際上,由於您爲{projectName}和{name}提供了默認值,因此完全與默認路由衝突。以下是您的選擇:

  • 刪除默認路由。如果您不再需要默認路由,請執行此操作。

  • 移動較長的路線第一,並使其更加明確,以便它不匹配缺省路由,如:

    routes.MapRoute(
        "ItemName", 
        "Home/{action}/{projectName}/{name}", 
        new { controller = "Home", action = "Index", name = "", projectName = "" } 
    ); 
    

    這種方式,與控制器的任何路線==首頁將匹配第一條路線,並且任何具有控制器!= Home的路線都將匹配第二條路線。

  • 使用RouteLinks而不是ActionLinks,具體指定你想要的路線,以便它使正確的鏈接沒有歧義。

0

您可以嘗試

Html.RouteLink("Edit","ItemName", new {name=m.name, projectName=m.Project.title}); 
1

剛剛從@Brad

<%=Html.RouteLink("Edit", "ItemName", new { projectName=m.Project.title, name=m.name, controller="Milestone", action="Edit"})%> 
清理,這裏是我終於做到了,解決它,謝謝答案