无法使用锚标记帮助程序使剃刀页面路由工作

Posted

技术标签:

【中文标题】无法使用锚标记帮助程序使剃刀页面路由工作【英文标题】:Can't get razor page route to work using anchor tag helper 【发布时间】:2020-06-01 13:40:25 【问题描述】:

背景

这是initial question 的后续问题,我询问了 asp.net core v3.1 razor 页面路由。

我按照解决方案here 中的建议将以下内容添加到启动中,这使我能够以我想要的两种方式路由到剃须刀页面:

services.AddMvc()
        .AddRazorPagesOptions(options => 
                 options.Conventions.AddAreaPageRoute("Identity", "/account/signupandapply", "/identity/account/signup")
        );
/identity/account/signup
/identity/account/signupandapply/<fooapplyid>

问题

我正在努力使用锚标记助手来尊重路径路由/identity/account/signupandapply/&lt;fooapplyid&gt;。 href 显示使用参数而不是 /identity/account/signupandapply?fooapplyid=&lt;fooapplyid&gt;。这是我的锚标记助手标记:

<a asp-area="identity" asp-page="/account/signupandapply" asp-route-fooapplyid="@Model.FooApplyId">Apply here</a>

目前,我正在手动设置 href,但想知道如何使用 tag helper 使其工作。

<a href="/identity/account/signupandapply/@Model.FooApplyId">Apply here</a>

注意:锚标记被添加到身份区域之外的视图中。

已尝试

我已尝试添加以下内容,以显示我想要的 href。即/identity/account/signupandapply/&lt;fooapplyid&gt;

.AddAreaPageRoute("Identity", "/account/signupandapply", "/identity/account/signupandapply/applyid")

但是当我转到页面时出现错误,这是有道理的

AmbiguousMatchException: The request matched multiple endpoints. Matches: /Account/SignUpAndApply /Account/SignUpAndApply

这些都不起作用,href 仍然显示为 ?applyid=:

.AddAreaPageRoute("Identity", "/account/signupandapply?applyid=", "/identity/account/signupandapply/applyid")

.AddAreaPageRoute("Identity", "/account/signupandapply/applyid?", "/identity/account/signupandapply/applyid")

问题

是否还有需要定义的进一步启动路径,或者我如何让锚标记助手尊重路径路径?

【问题讨论】:

【参考方案1】:
AddAreaPageRoute("Identity", "/account/signupandapply", "/identity/account/signup")

对此引用the docs(强调我的):

conventions.AddAreaPageRoute(string areaName, string pageName, string route)

将指定的route添加到位于指定区域的指定pageName的页面中。

除了基于路径的默认路由集之外,还可以通过route 路由页面。 为此页面生成的所有链接都将使用指定的路由。

所以这个约定有效地告诉路由从现在开始使用/identity/acount/signup 路由来生成所有链接,同时接受传入路由来命中两个这些路由。

不幸的是,我认为使用页面约定无法更好地控制这一点。 Razor 页面并不真正适合使用不同路径到达同一页面的路由模型。毕竟,Razor 页面是以页面为中心的,而不是像 MVC 操作那样以路由为中心。

因此,如果这对您来说是一项硬性要求,您可能希望考虑为这个用例使用控制器,而不是呈现相同的视图。值得一提的是,控制器确实可以很好地与使用 Razor 页面的应用程序混合使用。

【讨论】:

谢谢,我沿着剃须刀页面的路线(!),因为注册页面是我想要页面做的一个很好的起点。但是,鉴于您的澄清和建议,我将对其进行更改以使用 MVC。鉴于当前的文档,我的直觉是,如果我留下看起来像是一种 hack 的东西,那么它有可能在未来的版本中咬我。

以上是关于无法使用锚标记帮助程序使剃刀页面路由工作的主要内容,如果未能解决你的问题,请参考以下文章

同一页面内的 WKWebview 锚标签不起作用

链接到页面上的锚标记时元素周围的间距[重复]

导航被页面中的锚标记中断

使用 Owin 时无法使 ASP.NET Web API 2 帮助页面正常工作

如何使用 jQuery 启用或禁用锚点?

Vue js图像强制下载无法使用锚标记