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"

希望这对某人有所帮助。