[英]Configuring ASP.NET MVC Attribute Routing for multi language site
我正在創建一個支持多種語言的MVC5網站。 應用程序的結構很復雜,所以我只使用屬性路由。 RouteConfig.cs
非常簡單:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapMvcAttributeRoutes();
}
我希望通過在站點名稱后面添加語言標識符來保留URL中的語言信息。 對於默認語言的英語,URL應保持“干凈”。 這是一個例子:
http://test.com/foo/1/bar/2
http://test.com/de/foo/1/bar/2
我的第一次嘗試是為每個控制器使用兩個RoutePrefix
屬性:
[RoutePrefix("foo")]
[RoutePrefix("{lang}/foo")]
但是MVC不允許為控制器使用多個RoutePrefix
屬性。
所以現在我根本不使用RoutePrefix
屬性,並為每個控制器操作指定完整路由:
[Route("foo/{a}/bar/{b}")]
[Route("{lang}/foo/{a}/bar/{b}")]
有沒有更好的方法來處理lang
路線? 理想情況下,我只想在一個地方指定,而不是每個控制器。
PS。 我通過解析自定義過濾器中的語言路徑來設置當前的線程文化。
我發現最簡單的解決方案(至少對於ASP.NET MVC 5.2)是使用可選參數的默認值。
例如,如果英語是您的默認語言,您可以在Controller上使用單個屬性:
[RoutePrefix("{lang=en}/foo")]
或Action上的單個屬性:
[Route("{lang=en}/foo/bar")]
請注意,如果可選的URI參數(例如{lang?}
)位於URL的開頭,則它們不起作用。
如果所有其他方法都失敗了,那么我建議您按原樣保留默認路由,並將語言存儲在查詢參數中
對於英語,您的默認語言URL將按預期保持“干凈”。
http://test.com/foo/1/bar/2
但對於其他語言,您包含lang
作為查詢參數
http://test.com/foo/1/bar/2?lang=De-DE
然后在自定義過濾器中,檢查查詢參數是否存在。 如果是,那么改變文化以匹配。 否則使用默認語言。
另外:您應該使用5個字符編碼而不是2個char全球化ISO代碼。 De-DE而不是DE或fr-FR而不是FR
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.