使用Url.Action的MVC属性路由不解析路由

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)

  • 对于那些想要在ApiController中实现操作路径的人:@ Url.HttpRouteUrl在这种情况下可以解决问题;-) (2认同)

Nig*_*888 5

路由对顺序敏感。然而,属性却不然。事实上,当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)