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

时间:2018-05-22 15:32:13

标签: asp.net-core asp.net-core-mvc asp.net-mvc-routing asp.net-core-2.0 asp.net-core-tag-helpers

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

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

遗憾的是,{1}}属性在ASP.NET Core MVC中不可用,并且看起来使用标准[RoutePrefix(...)]属性无法模拟MVC5中的行为。

2 个答案:

答案 0 :(得分:1)

您似乎对控制器和路线感到困惑。使用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]令牌可以在控制器级别应用,如图所示,无需将其添加到每个方法。

答案 1 :(得分:1)

@Kirk所说的完全正确。我只想在MVC中了解/manage,因为通过查看示例中的链接,您似乎希望这些链接以{{1}}开头。

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