MVC 6 Anchor Tag Helper不产生预期的href

时间:2016-05-09 13:58:27

标签: asp.net-mvc asp.net-core asp.net-core-mvc

相当简单的问题。

<a asp-controller="Guide" asp-action="Index" asp-route-title="@Model.Title">Read more</a>

生成链接 /指南?title = Guide_no_1 ,但它应该生成链接 / Guide / Guide_no_1 / < /强>

我可以找到的文档都指定它应该输出 / Guide / Guide_no_1 / 所以我觉得我错过了一些东西,一个设置或一些属性某处。

我拥有的路线是这样的,只是因为它们对链接创建有影响

[Route("/Guide/")]
public IActionResult Index() { ... }

[Route("/Guide/{title}/{page?}/")]
public IActionResult Index(string title, int page = 0) { ... }

[Route("/Guide/OnePage/{title}/")]
public IActionResult Index(string title) { ... }

1 个答案:

答案 0 :(得分:4)

您需要指定属性路线的顺序。

  • 否则将按默认顺序评估它们,这可能是基于反射。评估的第一个是路径 / Guide / ,它匹配您指定的控制器和操作,因为它匹配,所以不会检查其他路径。

您需要订购路线,以便首先评估最具体的路线。在属性路由的情况下,您将使用订单参数:

执行此操作
[Route("Guide/OnePage/{title}/", Order = 1)]
public IActionResult Index(string title) { ... }    

[Route("Guide/{title}/{page?}/", Order = 2)]
public IActionResult Index(string title, int page = 0) { ... }

[Route("Guide/", Order = 3)]
public IActionResult Index() { ... }
  • 请注意它们在文件中出现的顺序无关紧要,评估顺序仅基于属性的 Order 参数。我只是写了它们,所以评估顺序很明确。

现在您会注意到,参与指南/ OnePage / {title} / 指南/ {title} / {page?} / <的2条路线也存在问题/ strong>即可。由于它们具有相同的控制器,动作和所需参数,因此MVC无法区分它们,并且首先订购的那个将永远赢得!

  • 为其中一条路线使用不同的操作名称
  • 或者将特定的路由名称分配给始终丢失的路由名称,以便您可以使用该名称创建链接:

    [Route("Guide/{title}/{page?}/", Name = "titleAndPage", Order = 2)]
    public IActionResult Index(string title, int page = 0) { ... }
    
    <a asp-route="titleAndPage" asp-route-title="fooTitle">Read more</a>