ASP.NET Core RazorPages强制AnchorTagHelper(asp-page)使用小写路由

问题描述 投票:7回答:4

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

任何帮助,将不胜感激!


我看过这些其他参考文献,但没有运气:

c# asp.net-core asp.net-core-mvc-2.0 razor-pages
4个回答
3
投票

将生成目标链接的url帮助程序将使用为路由生成的元数据。对于剃刀页面,它使用确切的文件路径来标识路由。

从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;
}

7
投票

将以下内容添加到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>

2
投票

现在它更容易一些,只需将它添加到Startup.cs中的ConfigureServices方法即可。

 services.Configure<RouteOptions>(options =>
                {
                    options.LowercaseUrls = true;
                });

0
投票

我通过一些反复试验找到了如何做到这一点。

标记帮助器将精确映射到命名文件时使用的大小写。

例如:

//the filename
..\Pages\CoNtAcT-uS.cshtml

//will output:
<a href="/CoNtAcT-uS">Contact Us</a>

所以为了解决我的问题,我刚刚将其重命名为我想要的

solution

这有效,但它不对。它打破了命名约定,我不推荐它。

不幸的是,我找不到任何有关此行为的支持文档

我宁愿选择一种编程方法。然而,我可以想象的唯一替代解决方案涉及覆盖或创建自定义标记帮助程序,这对于这样一个小问题似乎有点过分。

© www.soinside.com 2019 - 2024. All rights reserved.