如何使用锚标记帮助程序为非默认路由生成链接?

时间:2019-01-27 14:05:58

标签: asp.net-core asp.net-core-mvc

我正在尝试使用ASP.NET Core MVC路由来提供此模板:

routes.MapRoute(
    name: "project",
    template: "{projectID}/{controller=Home}/{action=Index}/{id?}"
);

这很好用,像/1/accounts/index这样的URL将projectID参数传递给Index控制器的Accounts操作。

但是,我不知道如何使用标准Tag Helper生成到此路由的链接。

我尝试过:

<a asp-route="project" asp-area="" asp-controller="Accounts" asp-action="Index" asp-route-projectID="1">Accounts</a>

但这会导致以下错误:

InvalidOperationException: Cannot determine the  'href' attribute for <a>. The following attributes are mutually  exclusive:  asp-route  asp-controller, asp-action  asp-page, asp-page-handler

实际上,文档明确指出我不能将asp-routeasp-controller, asp-action asp-page, asp-page-handler一起使用。 现在,我正在使用解决方法:

@Url.RouteUrl("project", new { controller = "Accounts", action = "Index", projectID = 1 })

但是如何使用Tag Helper生成此路线的链接?

2 个答案:

答案 0 :(得分:0)

您不应该结合使用asp-route="project"asp-controller="Accounts"来满足您的要求,请尝试

<a asp-controller="Accounts" asp-action="Index" asp-route-projectID="1">Accounts</a>

并确保您的“项目” MapRoute在其他MapRoute之前定义。

答案 1 :(得分:0)

据我了解,asp-route标签不需要指定控制器和操作。它将采用在命名路由中指定的控制器和动作,如果尚未在路由模板中定义该控制器和动作(如MapRoute中的控制器和动作),则它将使用当前RouteData。

让我们说说您在startup.cs中定义的“项目”路由模板,并且您当前位于“首页/索引”页面中,并且定义了以下锚点,

<a asp-route="project" asp-route-projectID="1">Accounts</a>将产生1/home/index

那么,如果您仍然想使用asp-route标签帮助器,该怎么办?

解决方案是使用属性路由,这样,命名路由就可以定义其控制器和操作。

因此,在AccountsController中,您需要设置Route Attribute,

    [Route("{projectID}/[controller]/[action]", Name = "accountsProject")]
    public class AccountsController : Controller
    {

,您将需要为所有需要此路由模板的控制器设置“路由属性”。假设您有UsersController,

    [Route("{projectID}/[controller]/[action]", Name = "usersProject")]
    public class UsersController : Controller
    {

因此,当您在首页/索引页面中设置以下锚点时,

<a asp-route="accountsProject" asp-route-projectID="1">Accounts</a>将产生1/accounts/index

<a asp-route="usersProject" asp-route-projectID="1">Users</a>将产生1/users/index

符合我们的预期。但是,如果您希望进行最小的更改,那么@Url.RouteUrl就足够了。