簡體   English   中英

為多語言站點配置ASP.NET MVC屬性路由

[英]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

你基本上需要三件事:

  • 一種用於處理傳入URL 的多語言感知路由 (如果您使用MVC5或更高版本,您也可以使用基於屬性的路由 ,但我仍然更喜歡使用全局規則來處理此問題)。
  • LocalizationAttribute用於處理這些類型的多語言請求。
  • 在應用程序中生成這些URL的輔助方法Html.ActionLink和/或Url.Action擴展方法)。

請參閱此答案以獲取更多詳細信息和代碼示例

(兩者都是用C#編寫的 - 附屬免責聲明:我制作了這些樣本)

有關其他信息和更多示例,您還可以閱讀我在此主題上撰寫的這篇博客文章

http://www.ryadel.com/en/html-actionlink-extension-method-written-c-handle-multi-language-routes-asp-net-mvc/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM