带有 Url.Action 的 MVC 属性路由未解析路由

Posted

技术标签:

【中文标题】带有 Url.Action 的 MVC 属性路由未解析路由【英文标题】:MVC Attribute routing with Url.Action not resolving route 【发布时间】:2016-07-16 05:09:13 【问题描述】:

根据我应用的属性路由,我无法让@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?

【问题讨论】:

【参考方案1】:

由于您为漂亮的路线定义命名,您可以使用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

【讨论】:

谢谢,为两条路线添加一个名称并使用 RouteUrl 是让这两条路线都能正常工作的唯一可靠方法。 对于那些来到这里并希望在 ApiController 中获得操作路由的人:@Url.HttpRouteUrl 在这种情况下得到了诀窍;-) 这帮助我将正确的路线传递给 Troy Goode 的 PagedList。绞尽脑汁将近一天! 如果搜索词和页面是动态参数怎么办??【参考方案2】:

路线是顺序敏感的。但是,属性不是。事实上,在像这样的单个操作上使用 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"

【讨论】:

谢谢,如果我使用 @html.ActionLink("Add Issues", "Index", new controller =“搜索”)。我可以让它工作的唯一可靠方法是为两者添加名称。【参考方案3】:

要返回完整的 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 的 MVC 属性路由未解析路由的主要内容,如果未能解决你的问题,请参考以下文章

无法显示带有 asp.net mvc url.action 链接的引导对话框

Url.Action 未输出自定义映射控制器路由

带有查询参数的 MVC 属性路由不起作用

带有 ASP.NET 路由的原始、未处理的 URL

带有aspnet mvc的ajax永远无法工作

VueJS 3 / 路由器 / 带有推送的重定向:未捕获(承诺中)类型错误:无法读取未定义的属性(读取“推送”)