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 &lt;a asp-page="/contact-us"&gt;Contact Us&lt;/a&gt;,输出为&lt;a href="/contact-us"&gt;Contact Us&lt;/a&gt; 【参考方案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

Asp .Net Core 2.2 Razor Pages Ajax Call Post 不工作

为啥 Razor Pages 是在 Asp.net Core 中创建 Web UI 的推荐方法?