2013-04-18 123 views
1

我想在我的ASP.NET MVC應用程序中使用路由實現本地化。ASP.NET MVC路由。資源未找到

例如: www.example.com/Home/Index - 將顯示默認文化的內容。 www.example.com/en/Home/Index - 將顯示英文內容。 www.example.com/ru/Home/Index - 俄語等等...

每個動作所以,我創建本地化屬性:

public class LocalizationAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if (filterContext.RouteData.Values["lang"] != null && !String.IsNullOrWhiteSpace(filterContext.RouteData.Values["lang"].ToString())) 
      { 
       var lang = filterContext.RouteData.Values["lang"].ToString(); 
       Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(lang); 
       Thread.CurrentThread.CurrentUICulture =    CultureInfo.CreateSpecificCulture(lang); 
      } 
      else 
      { 
       var langHeader = String.Empty; 
       langHeader = filterContext.HttpContext.Request.UserLanguages[0]; 
       Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(langHeader); 
       Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(langHeader); 
      } 

      base.OnActionExecuting(filterContext); 
     } 
    } 

我加入這個屬性在我的控制器的每一個動作。

和註冊路線:

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

    routes.MapRoute(
      "Localization", 
      "{lang}/{controller}/{action}/{id}", 
      new { lang = "en-US", controller = "Home", action = "Index", id = UrlParameter.Optional } 
      ); 

    routes.MapRoute(
      "Default", 
      "{controller}/{action}/{id}", 
        new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
      ); 

} 

導航到www.example.com/About/Contacts工作正常。 但是,當我導航到www.example.com/en/About/Contacts或類似的東西,我得到404 error:找不到資源。 那麼,可能是什麼問題?

在此先感謝您的幫助!

回答

2

通過導航到www.example.com/en/About/Contacts您實際上仍在調用默認路由。在這種情況下,兩條路線都將匹配,但只有最後指定的一條(頂部至底部的 )將被調用。

所以,當您瀏覽的網址默認路由將承擔如下: 控制器:EN 行動:關於 編號:聯繫人

您應該添加約束你的路線,使其更具針對性。 或者您可以將「本地化」路線移動到「默認」路線下方,這樣兩種方式仍然可以匹配,但在這種情況下,最後一個將是「本地化」。

如果您將來需要排除類似故障,我建議您使用RouteDebugger NuGet軟件包,它可以幫助您瞭解哪些路由匹配請求以及哪個路由將實際執行並使用哪些參數。以下是指向菲爾哈克博客條目:http://haacked.com/archive/2011/04/12/routedebugger-2.aspx

+0

非常感謝您的幫助!我安裝了RouteDebugger,它真的說了以下內容 控制器:en 操作:關於 ID:聯繫人。 因此,我爲lang和controller添加約束: constraints:new {lang = @「^ [az] {2} $」,controller = @「^ [a-zA-Z] {3,} $」} 但仍顯示: 控制器:en 操作:關於 ID:聯繫人。 –

+0

您無需爲「本地化」路由添加約束,因爲它只是使該路由更具體。正如我所說的那樣,你想匹配的路線確實匹配,但是「默認」被調用,因爲它是添加到路線中的最新路線(更底下的「重要」路線)。嘗試切換路由的順序或在「默認」路由中的Id參數上添加(例如)數字約束,以便它將使默認路由不再匹配該特定請求。 – chrisd84

+0

不,沒有。但是我注意到,我的「本地化」路由甚至不顯示在RouteDebugger的「所有路由」表中,其中顯示「默認」路由。如果我刪除「默認」路線,沒有任何變化。 謝謝你的時間! –