Url.Action 不解析路由的 MVC 属性路由
MVC Attribute routing with Url.Action not resolving route
我无法让 @Url.Action
解析到我期望的 url 基于我应用的属性路由:
我的操作(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 })
这导致 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
属性时,您可能会发现它适用于某些编译而不适用于其他编译,因为反射在分析自定义属性时不保证顺序。
为确保您的路线以正确的顺序输入路线 table,您需要将 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"
要return完整URL使用这个
@Url.Action("Index", new { controller = "Search", searchTerm = "replaceMe", page = 1}, protocol: Request.Url.Scheme)
// Returns "http://yourdomain.com/add/replaceMe/page/1"
希望这对某人有所帮助。
我无法让 @Url.Action
解析到我期望的 url 基于我应用的属性路由:
我的操作(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 })
这导致 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
属性时,您可能会发现它适用于某些编译而不适用于其他编译,因为反射在分析自定义属性时不保证顺序。
为确保您的路线以正确的顺序输入路线 table,您需要将 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"
要return完整URL使用这个
@Url.Action("Index", new { controller = "Search", searchTerm = "replaceMe", page = 1}, protocol: Request.Url.Scheme)
// Returns "http://yourdomain.com/add/replaceMe/page/1"
希望这对某人有所帮助。