2017-10-06 30 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-選項 –