如何使用标记帮助程序创建指向在路由属性中使用斜杠的控制器/操作的链接?



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

我正在创建一个 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。

谁能提出一种方法来阻止它逃脱我的斜杠?

编辑:更多详细信息

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

我正在尝试实现一个功能文件夹设置,我已经成功地与 MVC5 一起使用 ASP.NET 该设置利用属性路由和自定义视图引擎来允许嵌套功能。为了完成这项工作,我使用了[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 核心 MVC 中不可用,并且使用标准[Route(...)]属性似乎无法模拟 MVC5 中的行为。

您似乎混淆了控制器和路由。使用asp-controller时,应提供控制器类的名称(不带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开头。

我之前分享了如何在 MVC 中设置区域。你可以看看这里。

最新更新