8

我在 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>

为了更详细地说明为什么这对我的网络应用程序很重要,请想象一个长网址,就像您在 stackoverflow.com 上看到的那样

https://stackoverflow.com/questions/anchortaghelper-asp-page-to-use-lowercase

                       -- VS --

https://stackoverflow.com/Questions/Anchortaghelper-asp-page-to-use-lowercase

任何帮助,将不胜感激!


我查看了这些其他参考资料,但没有运气:

4

3 回答 3

17

将以下内容添加到您的ConfigureServices方法中Startup.cs。它可以在之前或之后添加services.AddMvc();

services.AddRouting(options =>
{
    options.LowercaseUrls = true;
});

现在为锚标签

<a asp-page="/Contact-Us">Contact Page</a>

和输出

<a href="/contact-us">Contact Page</a>
于 2017-10-14T03:25:10.470 回答
5

现在更简单了,只需将其添加到 Startup.cs 中的 ConfigureServices 方法即可。

 services.Configure<RouteOptions>(options =>
                {
                    options.LowercaseUrls = true;
                });
于 2018-06-01T20:21:31.857 回答
3

将生成目标链接的 url 助手将使用为路由生成的元数据。对于 razor 页面,这使用确切的文件路径来标识路由。

从 ASP.NET Core 2.1 开始,您可能能够像使用Route属性的 MVC 路由一样调整路由。至少计划在 2.1 版本中发布

在那之前,您必须在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;
}
于 2017-10-09T08:41:07.087 回答