相当简单的问题。

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

产生链接/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) { ... }

最佳答案

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

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

  • 您需要订购路线,以便首先评估最具体的路线。对于属性路由,您将使用 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() { ... }
    
  • 请注意,它们在文件中出现的顺序无关紧要,评估顺序仅基于属性的Order参数。我只是写了它们,所以评估的顺序很明确。

  • 现在,您会发现这两个路由的参数 Guide/OnePage/{title}/ Guide/{title}/{page?}/也有问题。由于它们具有相同的 Controller , Action 和所需的参数,因此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>
    
  • 关于asp.net-mvc - MVC 6 anchor 标记助手未产生预期的href,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37117712/

    10-12 17:27