根据我申请的属性路线,我无法让@Url.Action
解析为我所期望的网址:
我的操作(SearchController但使用[RoutePrefix(“add”)])
[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.Action
没有解析正确的网址?
答案 0 :(得分:16)
由于您的漂亮路线定义有名称,因此您可以使用RouteUrl
方法。
@Url.RouteUrl("NamedSearch", new { searchTerm = "replaceMe", page = 1})
由于您需要添加网址,因此您应该更新路线定义以将其包含在网址模式中。
[Route("~/add")]
[Route("~/add/{searchTerm?}/page/{page?}", Name = "NamedSearch")]
public ActionResult Index(string searchTerm = "", int page = 1)
{
// to do : return something
}
答案 1 :(得分:4)
路线对订单敏感。但是,属性不是。实际上,当在这样的单个动作上使用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.Action("Index", new { controller = "Search", searchTerm = "replaceMe", page = 1 })
// Returns "/add/replaceMe/page/1"