MVC 6 Anchor Tag Helper 没有产生预期的 href

Tho*_*ian 5 asp.net-mvc asp.net-core-mvc asp.net-core

相当简单的问题。

<a asp-controller="Guide" asp-action="Index" asp-route-title="@Model.Title">Read more</a>
Run Code Online (Sandbox Code Playgroud)

产生链接/Guide?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) { ... }
Run Code Online (Sandbox Code Playgroud)

Dan*_*.G. 4

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

  • 否则,它们将按照默认顺序进行评估,这可能基于反射。第一个评估的是路线/Guide/,它与您指定的控制器和操作相匹配,并且由于它是匹配的,因此不再检查其他路线。

您需要对路线进行排序,以便首先评估最具体的路线。在属性路由的情况下,您将使用Order参数来执行此操作:

[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() { ... }
Run Code Online (Sandbox Code Playgroud)
  • 请注意,它们在文件中出现的顺序并不重要,评估顺序仅基于属性的Order参数。我只是写了它们,所以评估的顺序很清楚。

现在您会注意到,参数Guide/OnePage/{title}/Guide/{title}/{page?}/ 的2 条路由也存在问题。由于它们具有相同的控制器、操作和所需参数,因此 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>
    
    Run Code Online (Sandbox Code Playgroud)