2017-10-06 103 views
4

我在ASP.NET Core v2.0中使用RazorPages,我想知道如果有人知道如何强制AnchorTagHelper使用小写吗?ASP.NET Core RazorPages强制AnchorTagHelper(asp页)使用小写路由

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

输出得到:

例如,在我的.cshtml加价,我会使用asp-page标签助手有以下锚标记它更多的上下文,为什么这对我的网络应用程序很重要,请想象一个很长的URL,就像你会看到什么在stackoverflow.com

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

         -- VS -- 

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

任何帮助,将不胜感激!


我已经看过这些其他的引用,但没有运气:

+0

你有没有设置设置你的链接建议您设置的加入? – poke

+0

由于标记助手只是语法糖,为什么不直接写出href? asp.net自定义是PascalCase页面名称 –

+0

@BradPatton你可能有一点,但是有一些'asp-page'功能,例如适当处理“不可路由”的不存在的页面链接。 - 我完全同意帕斯卡案例的观点,文件结构会因我在下面的回答中做的事情而变得很糟糕。 – Svek

回答

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; 
} 
+0

我比我的解决方案更喜欢这个,有一个很大的例外......我相信在你的例子中'/ ContactUs'仍然是可路由的。你如何删除默认路由? – Svek

+0

@Svek扩大我的答案 – poke

0

我发现了如何通过一些试验和错误做到这一点。

标记助手将完全映射到命名文件时使用的大小写。

例如:

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

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

所以要解决我的问题,我刚刚改名为我想

solution

这工作,但它是不正确的。它打破了命名约定,我不会推荐它。

不幸的是,我无法找到任何证明文件针对此行为

我宁愿做它的编程方法。然而,我可以想象的这个唯一的替代解决方案涉及覆盖或创建一个自定义标签助手,这似乎有点矫枉过正如此琐碎的事情。

3

以下内容添加到您的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> 
+0

这是正确的答案。请参阅http://www.learnrazorpages.com/razor-pages/tag-helpers/anchor-tag-helper#routing-选项 –