我无法根据我应用的属性路由将@Url.Action
解析为我期望的url:
我的操作(SearchController,但带有[RoutePrefix("add")])
[Route("{searchTerm}/page/{page?}", Name = "NamedSearch")]
[Route("~/add")]
public ActionResult Index(string searchTerm = "", int page = 1)
{
...
}
调用Url。操作
@Url.Action("Index", new { controller = "Search", searchTerm = "replaceMe", page = 1 })
这导致的url
/add?searchTerm=replaceMe&page=1
我希望
/add/replaceMe/page/1
如果我手动键入url,那么它将解析为具有正确参数的正确操作。为什么@Url.Action
不能解析正确的url?
由于您有漂亮路由定义的名称,因此可以使用RouteUrl
方法。
@Url.RouteUrl("NamedSearch", new { searchTerm = "replaceMe", page = 1})
既然你需要添加url,你应该更新你的路由定义,将其包含在url模式中。
[Route("~/add")]
[Route("~/add/{searchTerm?}/page/{page?}", Name = "NamedSearch")]
public ActionResult Index(string searchTerm = "", int page = 1)
{
// to do : return something
}
路由对顺序敏感。但是,属性不是。事实上,当在这样的单个操作上使用2个Route
属性时,您可能会发现它在某些编译中有效,而在其他编译中无效,因为反射在分析自定义属性时不能保证顺序。
为了确保您的路由以正确的顺序输入到路由表中,您需要将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"
要返回完整的URL,请使用此
@Url.Action("Index", new { controller = "Search", searchTerm = "replaceMe", page = 1}, protocol: Request.Url.Scheme)
// Returns "http://yourdomain.com/add/replaceMe/page/1"
希望这能帮助到别人。