ASP.NET Core Razor Pages 强制 Anchor Tag Helper (asp-page) 使用小写路由
Posted
技术标签:
【中文标题】ASP.NET Core Razor Pages 强制 Anchor Tag Helper (asp-page) 使用小写路由【英文标题】:ASP.NET Core RazorPages to force AnchorTagHelper (asp-page) to use lowercase routes 【发布时间】:2018-03-17 19:58:37 【问题描述】:我在 ASP.NET Core v2.0 中使用 RazorPages,我想知道是否有人知道如何强制 AnchorTagHelper
使用小写?
例如,在我的.cshtml
标记中,我将使用asp-page
标签助手获得以下锚标签:
<a asp-page="/contact-us">Contact Us</a>
我正在寻找的输出
// i want this
<a href="/contact-us">Contact Us</a>
// i get this
<a href="/Contact-us">Contact Us</a>
为了更详细地说明为什么这对我的网络应用程序很重要,请想象一个长 URL,就像您在 ***.com 上看到的那样
https://***.com/questions/anchortaghelper-asp-page-to-use-lowercase
-- VS --
https://***.com/Questions/Anchortaghelper-asp-page-to-use-lowercase
任何帮助将不胜感激!
我看过这些其他参考资料,但没有运气:
https://github.com/aspnet/Mvc/issues/6393 How do you enforce lowercase routing in ASP.NET Core MVC 6?【问题讨论】:
您是否设置了设置链接建议您设置? 既然标签助手只是语法糖,为什么不直接写出 href 呢? asp.net 的自定义是 PascalCase 页面名称 @BradPatton 你可能有一点,但asp-page
有一些功能,例如正确处理“不可路由”不存在的页面链接。 -- 我也完全同意帕斯卡的观点,文件结构变得丑陋,因为我在下面的回答中做了什么。
你是如何设置LowercaseUrls
的?因为我刚刚创建了一个带有剃须刀页面的新网络应用程序,它运行良好。
我使用了taghelper <a asp-page="/contact-us">Contact Us</a>
,输出为<a href="/contact-us">Contact Us</a>
。
【参考方案1】:
将以下内容添加到Startup.cs
中的ConfigureServices
方法中。可以在services.AddMvc();
之前或之后添加
services.AddRouting(options =>
options.LowercaseUrls = true;
);
现在是锚标记
<a asp-page="/Contact-Us">Contact Page</a>
还有输出
<a href="/contact-us">Contact Page</a>
【讨论】:
这是正确答案。见learnrazorpages.com/razor-pages/tag-helpers/…【参考方案2】:现在更简单了,只需将其添加到 Startup.cs 中的 ConfigureServices 方法即可。
services.Configure<RouteOptions>(options =>
options.LowercaseUrls = true;
);
【讨论】:
这是一个非常简单的解决方案。谢谢。【参考方案3】:生成目标链接的 url 助手将使用为路由生成的元数据。对于 razor 页面,这将使用确切的文件路径来标识路径。
从 ASP.NET Core 2.1 开始,您可能能够像使用 Route
属性的 MVC 路由一样调整路由。至少it’s planned for the 2.1 release。
在此之前,您必须在 ConfigureServices
方法中为您的页面配置特定路由:
services.AddMvc()
.AddRazorPagesOptions(options =>
options.Conventions.AddPageRoute("/ContactUs", "contact-us");
);
这将使现有路由保持可用,因此如果您不希望这样做,则需要替换此页面的路由选择器。没有内置的方法可以做到这一点,但是当你知道该怎么做时,做到这一点并不难。
为了避免代码重复并使一切变得更好,我们将创建一个ReplacePageRoute
扩展方法,它与上面AddPageRoute
的用法基本匹配:
services.AddMvc()
.AddRazorPagesOptions(options =>
options.Conventions.ReplacePageRoute("/Contact", "contact-us");
);
该方法的实现直接受到AddPageRoute
的启发:
public static PageConventionCollection ReplacePageRoute(this PageConventionCollection conventions, string pageName, string route)
if (conventions == null)
throw new ArgumentNullException(nameof(conventions));
if (string.IsNullOrEmpty(pageName))
throw new ArgumentNullException(nameof(pageName));
if (route == null)
throw new ArgumentNullException(nameof(route));
conventions.AddPageRouteModelConvention(pageName, model =>
// clear all existing selectors
model.Selectors.Clear();
// add a single selector for the new route
model.Selectors.Add(new SelectorModel
AttributeRouteModel = new AttributeRouteModel
Template = route,
);
);
return conventions;
【讨论】:
我比我的解决方案更喜欢这个,但有一个很大的例外......我相信/ContactUs
在您的示例中仍然可以路由。如何删除默认路由?
@Svek 扩展了我的答案以上是关于ASP.NET Core Razor Pages 强制 Anchor Tag Helper (asp-page) 使用小写路由的主要内容,如果未能解决你的问题,请参考以下文章
带有 id 的 asp.net core 2 razor pages 路由
如何正确重定向到 ASP.NET Core Razor Pages 中的同一页面?
我无法在 asp.net core 2.0 razor pages 中执行下载操作
在 ASP.net core 3.1 Razor Pages 中打印 PDF