我正在尝试使用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-route
与asp-controller, asp-action asp-page, asp-page-handler
一起使用。
现在,我正在使用解决方法:
@Url.RouteUrl("project", new { controller = "Accounts", action = "Index", projectID = 1 })
但是如何使用Tag Helper生成此路线的链接?
答案 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
就足够了。