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

时间:2016-03-28 20:44:13

标签: 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)
     {
       ...
     }

致电Url.Action

@Url.Action("Index", new { controller = "Search", searchTerm = "replaceMe", page = 1 })

这会产生一个

的网址
  

/add?searchTerm=replaceMe&page=1

我希望

  

/add/replaceMe/page/1

如果我手动输入网址,则会使用正确的参数解析为正确的操作。为什么@Url.Action没有解析正确的网址?

2 个答案:

答案 0 :(得分:16)

由于您的漂亮路线定义有名称,因此您可以使用RouteUrl方法。

@Url.RouteUrl("NamedSearch", new {  searchTerm = "replaceMe", page = 1})

由于您需要添加网址,因此您应该更新路线定义以将其包含在网址模式中。

[Route("~/add")]
[Route("~/add/{searchTerm?}/page/{page?}", Name = "NamedSearch")]
public ActionResult Index(string searchTerm = "", int page = 1)
{
 // to do : return something
}

答案 1 :(得分:4)

路线对订单敏感。但是,属性不是。实际上,当在这样的单个动作上使用2 Route属性时,您可能会发现它适用于某些编译而不适用于其他编辑,因为在分析自定义属性时Reflection不保证顺序。

为确保您的路线以正确的顺序输入路线表,您需要为每个属性添加Order属性。

[Route("{searchTerm}/page/{page?}", Name = "NamedSearch", Order = 1)]
[Route("~/add", Order = 2)]
public ActionResult Index(string searchTerm = "", int page = 1)
{
    return View();
}

修正排序问题后,网址会以您期望的方式解析。

@Url.Action("Index", new { controller = "Search", searchTerm = "replaceMe", page = 1 })

// Returns "/add/replaceMe/page/1"