2016-03-05 83 views
3

我正在創建一個應支持多種語言的MVC5網站。該應用程序的結構很複雜,所以我只使用屬性路由。 RouteConfig.cs很簡單:爲多語言站點配置ASP.NET MVC屬性路由

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。我通過在自定義過濾器中解析語言路由來設置當前線程文化。

+1

看一看[這個答案](http://stackoverflow.com/questions/32764989/asp-net-mvc-5-culture-in-route-and-url#32839796)。對於屬性路由,請閱讀註釋。 – NightOwl888

+0

所以你的建議只是爲每個動作添加兩條路線?或者我錯過了什麼? –

+0

您可以1)每個動作添加2個路由2)使用傳統路由或3)分析MapMvcAttributeRoutes源,併爲每個Route屬性註冊一個本地化路由(請務必在調用您的自定義方法之前'MapMvcAttributeRoutes'將路由以正確的順序放入RouteTable中)。 – NightOwl888

回答

0

如果這些方法都失敗,那麼我建議你保持你的默認路由的值並存儲在語言的查詢參數

對於英語,默認語言,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

+0

我正在考慮這種方法,但我希望儘可能保持URL清潔。 –

1

我發現最簡單的解決方案(至少對於ASP.NET MVC 5.2)是使用可選參數的默認值。

例如,如果英語是你的默認語言,你可以使用控制器上的一個屬性:

[RoutePrefix("{lang=en}/foo")] 

或行動的單一屬性:

[Route("{lang=en}/foo/bar")] 

注意,可選的URI參數(如{lang?})如果位於URL的起始位置,則不起作用。

0

你基本上需要三樣東西:

  • 多語言感知路由處理傳入的URL(如果你使用MVC5或以上,你也可以去基於屬性的路由,而不是,但我仍然傾向於使用全局規則來處理這個問題)。
  • A LocalizationAttribute來處理這些類型的多語言請求。
  • 幫助程序在您的應用程序(Html.ActionLink和/或Url.Action擴展方法)中生成這些URL的幫助方法。

查看this answer瞭解更多詳情和代碼示例。

(兩者都是用C#編寫)

有關其他信息,並進一步樣品關於這個主題,你也可以閱讀this post

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