5

路由我不能讓@Url.Action解析到我根據我已經申請了屬性路線上預期的網址:MVC屬性與Url.Action不解決途徑

我的動作(SearchController但[RoutePrefix(「加「)])

 [Route("{searchTerm}/page/{page?}", Name = "NamedSearch")] 
    [Route("~/add")] 
    public ActionResult Index(string searchTerm = "", int page = 1) 
    { 
     ... 
    } 

電話Url.Action

@Url.Action("Index", new { controller = "Search", searchTerm = "replaceMe", page = 1 }) 

這導致

/add?searchTerm=replaceMe&page=1

一個網址我希望

/add/replaceMe/page/1

如果鍵入的URL手動然後將其解析爲正確的操作正確的參數。爲什麼@Url.Action解決了正確的url?

回答

11

既然你有一個漂亮的路線定義的名稱,你可以使用RouteUrl方法。

@Url.RouteUrl("NamedSearch", new { searchTerm = "replaceMe", page = 1}) 

由於您需要添加網址,您應該更新您的路由定義以將其包含在url模式中。

[Route("~/add")] 
[Route("~/add/{searchTerm?}/page/{page?}", Name = "NamedSearch")] 
public ActionResult Index(string searchTerm = "", int page = 1) 
{ 
// to do : return something 
} 
+1

謝謝,爲兩條路線添加一個名稱並使用RouteUrl是使這兩條路線都能正常工作的唯一可靠方法。 – Simon

+0

對於那些來到這裏,想要一個ApiController中的行動的路線:@ Url.HttpRouteUrl在這種情況下得到的竅門;-) –

+0

這幫助我通過正確的路線Troy Goode的PagedList。幾乎一天的時間,我的腦袋都在絞盡腦汁! – Shiva

3

路由對順序敏感。但是,屬性不是。實際上,當像這樣使用2 Route屬性時,可能會發現它適用於某些編譯,而不適用於其他編譯器,因爲在分析自定義屬性時,Reflection並不能保證順序。

爲確保您的路由以正確的順序輸入到路由表中,您需要將Order屬性添加到每個屬性。

[Route("{searchTerm}/page/{page?}", Name = "NamedSearch", Order = 1)] 
[Route("~/add", Order = 2)] 
public ActionResult Index(string searchTerm = "", int page = 1) 
{ 
    return View(); 
} 

修復排序問題後,URL可以解決您期望的問題。

@Url.Action("Index", new { controller = "Search", searchTerm = "replaceMe", page = 1 }) 

// Returns "/add/replaceMe/page/1" 
+0

謝謝,我發現這固定'NamedSearch'路線,但打破了基本路線(訂單= 2),如果我使用@ Html.ActionLink(「添加問題」,「索引」,新{控制器=「搜索」})。我能得到這個工作的唯一可靠方法是爲兩者添加名字。 – Simon

0

要返回完整的URL使用本

@Url.Action("Index", new { controller = "Search", searchTerm = "replaceMe", page = 1}, protocol: Request.Url.Scheme) 

// Returns "http://yourdomain.com/add/replaceMe/page/1" 

希望這可以幫助別人。