Url为的MVC属性路由.操作未解析路由



我无法根据我应用的属性路由将@Url.Action解析为我期望的url:

我的操作(SearchController,但带有[RoutePrefix("add")])

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

调用Url。操作

@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属性时,您可能会发现它在某些编译中有效,而在其他编译中无效,因为反射在分析自定义属性时不能保证顺序。

为了确保您的路由以正确的顺序输入到路由表中,您需要将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"

要返回完整的URL,请使用此

@Url.Action("Index", new { controller = "Search", searchTerm = "replaceMe", page = 1}, protocol: Request.Url.Scheme)
// Returns "http://yourdomain.com/add/replaceMe/page/1"

希望这能帮助到别人。

最新更新