您如何使用标签助手创建指向 controllers/actions 的链接,这些链接在路由属性中使用斜杠?

How do you use tag helpers to create links to controllers/actions that use slashes in route attributes?

在我开始之前,我知道有类似的问题,但它们都与在路由中使用带有参数的斜线有关,这不是我想要实现的(至少现在还没有) ).

我正在创建一个 ASP.NET Core 2 MVC Web 应用程序,但在创建指向我的操作的链接时,我的路由中的斜杠被转义了。我有以下控制器:

[Route("Manage/Account")]
public class AccountsController : Controller
{
    [Route("[Action]")]
    public IActionResult Index() => View();

    [Route("[Action]")]
    public IActionResult Other() => View();
}

以及视图中的以下链接:

<a asp-controller="Manage/Accounts" asp-action="Index">Accounts</a>
<a asp-controller="Manage/Account" asp-action="Other">Accounts (Other)</a>

这会生成以下 HTML:

<a href="/Manage%5CAccount">Accounts</a>
<a href="/Manage%5CAccount/Other">Accounts (Other)</a>

请注意,斜杠已被转义为 %5C,公平地说,这确实有效,链接实际上将我带到了正确的操作。此外,通过浏览器地址栏手动将斜杠放回原处也可以让我采取正确的操作。然而,这确实给了我一些我不想拥有的难看的 URL。

任何人都可以建议一种方法来阻止它逃避我的斜杠吗?

编辑:更多详细信息

在我努力将我的问题精简到最低限度的过程中,我担心我可能遗漏了一些关于我的最终目标的重要背景。

我正在尝试实现一个功能文件夹设置,我已成功将其与 ASP.NET MVC5 一起使用,它使用属性路由和自定义视图引擎来允许嵌套功能。为了完成这项工作,我使用了 [RoutePrefix(...)]。下面的控制器将位于以下目录 ~/Features/Manage/Accounts:

[RoutePrefix("Manage/Accounts")]
public class Accounts : Controller
{
    [Route("Index")]
    public ActionResult Index() => View();

    [Route("Other")]
    public ActionResult Other() => View();
}

然后在这样的视图中添加了链接:

@Html.ActionLink("Accounts", "Index", "Manage/Accounts")
@Html.ActionLink("Accounts (Other)", "Other", "Manage/Accounts")

然后呈现为:

<a href="/Manage/Accounts">Accounts</a>
<a href="/Manage/Accounts/Other">Accounts (Other)</a>

遗憾的是,[RoutePrefix(...)] 属性在 ASP.NET Core MVC 中不可用,使用标准 [Route(...)] 属性似乎无法模拟 MVC5 中的行为。

您似乎混淆了控制器和路由。使用 asp-controller 时,您需要提供控制器的名称 class(不带 Controller 后缀)。在您的情况下,您需要:

<a asp-controller="Accounts" asp-action="Index">Accounts</a>
<a asp-controller="Accounts" asp-action="Other">Accounts (Other)</a>

使用上面的方法,你应该得到预期的路线:

<a href="/Manage/Account">Accounts</a>
<a href="/Manage/Account/Other">Accounts (Other)</a>

顺便说一句,你可以简化你的属性,像这样:

[Route("Manage/Account/[action]")]
public class AccountsController : Controller
{
    public IActionResult Index() => View();

    public IActionResult Other() => View();
}

[action] 令牌可以在控制器级别应用,如图所示,避免将其添加到每个方法的需要。

@Kirk 说的完全正确。我只想让您了解 MVC 中的 Area,因为通过查看示例中的链接,您似乎希望这些链接以 /manage.[=13= 开头]

我之前分享过如何在 MVC 中设置区域。你可以看看.