Sim*_*mon 12 asp.net-mvc routes url-routing asp.net-mvc-routing attributerouting
@Url.Action
根据我申请的属性路线,我无法解析我期望的网址:
我的动作(SearchController,但[RoutePrefix("add")])
[Route("{searchTerm}/page/{page?}", Name = "NamedSearch")]
[Route("~/add")]
public ActionResult Index(string searchTerm = "", int page = 1)
{
...
}
Run Code Online (Sandbox Code Playgroud)
致电Url.Action
@Url.Action("Index", new { controller = "Search", searchTerm = "replaceMe", page = 1 })
Run Code Online (Sandbox Code Playgroud)
这导致了一个网址
/add?searchTerm=replaceMe&page=1
我期待
/add/replaceMe/page/1
如果我手动输入网址,则会使用正确的参数解析为正确的操作.为什么不@Url.Action
解析正确的网址?
Shy*_*yju 16
由于您有漂亮路径定义的名称,因此您可以使用该RouteUrl
方法.
@Url.RouteUrl("NamedSearch", new { searchTerm = "replaceMe", page = 1})
Run Code Online (Sandbox Code Playgroud)
由于您需要添加URL,因此您应该更新路径定义以将其包含在url模式中.
[Route("~/add")]
[Route("~/add/{searchTerm?}/page/{page?}", Name = "NamedSearch")]
public ActionResult Index(string searchTerm = "", int page = 1)
{
// to do : return something
}
Run Code Online (Sandbox Code Playgroud)
路由对顺序敏感。然而,属性却不然。事实上,当Route
像这样在单个操作上使用 2 个属性时,您可能会发现它适用于某些编译,而不适用于其他编译,因为反射在分析自定义属性时不保证顺序。
为了确保您的路由以正确的顺序输入到路由表中,您需要将该Order
属性添加到每个属性中。
[Route("{searchTerm}/page/{page?}", Name = "NamedSearch", Order = 1)]
[Route("~/add", Order = 2)]
public ActionResult Index(string searchTerm = "", int page = 1)
{
return View();
}
Run Code Online (Sandbox Code Playgroud)
解决排序问题后,URL 将按您期望的方式解析。
@Url.Action("Index", new { controller = "Search", searchTerm = "replaceMe", page = 1 })
// Returns "/add/replaceMe/page/1"
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
6791 次 |
最近记录: |