2016-09-07 10 views
9

URLの一部としてカルチャを扱うようにBaseControllerを設定しようとしています(ASP.NET MVC 5 Internationalizationベース)。エリアの登録を無効にする限り、私の実装は適切に機能します。Response.RedirectToRoute(RouteData.Values)は、エリアコントローラにリダイレクトします

私の地域の1つが登録されているときに、間違った/サポートされていない文化(http://localhost:52639/zz/)を入力しようとすると、リクエストURL:http://localhost:52639/fr/Test/Postで404エラーが発生します。

私のルートが正しく登録されていることを確認しました。

エリア登録を無効にして同じ操作を行った場合、次のURLを入力すると、ベースコントローラとルーティングが正しく動作します。http://localhost:52639/fr/(デフォルトのカルチャ)にリダイレクトされました。

は、それらは私のルートです:

public static void RegisterRoutes(RouteCollection routes) 
    { 
     var namespaces = new[]{typeof(PostController).Namespace}; 

     routes.IgnoreRoute("favicon.ico"); 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute("PostToHack", "{culture}/Post/{idAndSlug}", new { culture = "", Controller = "Post", Action = "Show" }, namespaces); 
     routes.MapRoute("Post", "{culture}/Post/{id}-{slug}", new { culture = "", Controller = "Post", Action = "Show" }, namespaces); 

     routes.MapRoute("TagToHack", "{culture}/Tag/{idAndSlug}", new { culture = "", Controller = "Post", Action = "Tag" }, namespaces); 
     routes.MapRoute("Tag", "{culture}/Tag/{id}-{slug}", new { culture = "", Controller = "Post", Action = "Tag" }, namespaces); 

     routes.MapRoute("Logout", "{culture}/Logout", new { culture = "", Controller = "Authentication", Action = "Logout" }, namespaces); 
     routes.MapRoute("Login", "{culture}/Login", new { culture = "", Controller = "Authentication", Action = "Login" }, namespaces); 

     //Error routes 
     routes.MapRoute("Error404", "{culture}/errors/404", new { culture = "", Controller = "Errors", Action = "NotFound" }, namespaces); 
     routes.MapRoute("Error500", "{culture}/errors/500", new { culture = "", Controller = "Errors", Action = "Error" }, namespaces); 

     routes.MapRoute("Home", "{culture}", new { culture = "", Controller = "Post", Action = "Index"},namespaces); 

     //Never to be called by user which is why it comes after MapRoute Home so it is always overwritten by it 
     routes.MapRoute("Sidebar", "{culture}", new { culture = "", Controller = "Layout", Action = "Sidebar"},namespaces);//This is a "child-only" controller 
     routes.MapRoute("NavigationBar", "{culture}", new { culture = "", Controller = "Layout", Action = "NavigationBar"},namespaces);//This is a "child-only" controller 

エリアルート

public override void RegisterArea(AreaRegistrationContext context) 
    { 
     var namespaces = new[] { typeof(PostsController).Namespace }; 

     context.MapRoute(
      "admin_default", 
      "{culture}/admin/{controller}/{action}/{id}", 
      new { culture = "", action = "Index", id = UrlParameter.Optional }, namespaces 
      ); 
    } 

ベースコントローラ:一部カ月後

public class BaseController : Controller 
{ 
    protected override IAsyncResult BeginExecuteCore(AsyncCallback callback, object state) 
    { 
     var cultureName = RouteData.Values["culture"] as string; 

     // Attempt to read the culture cookie from Request 
     if (cultureName == null) 
      cultureName = (Request.UserLanguages != null) && (Request.UserLanguages.Length > 0) 
       ? Request.UserLanguages[0] 
       : null; // obtain it from HTTP header AcceptLanguages 

     // Validate culture name 
     cultureName = CultureHelper.GetImplementedCulture(cultureName); // This is safe 


     if (RouteData.Values["culture"] as string != cultureName) 
     { 
      // Force a valid culture in the URL 
      RouteData.Values["culture"] = cultureName.ToLowerInvariant(); // lower case too 

      // Redirect user 
      Response.RedirectToRoute(RouteData.Values); 
     } 

     // Modify current thread's cultures    
     Thread.CurrentThread.CurrentCulture = new CultureInfo(cultureName); 
     Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture; 

     return base.BeginExecuteCore(callback, state); 
    } 
} 

答えて

0

再調査私は私のために働く解決策を見つけました。私の問題は私が自分のルートを登録していた順番から来ていました。私が最初に私のエリアのルートを登録しました:

protected void Application_Start() 
    { 
     AreaRegistration.RegisterAllAreas(); 
     RouteConfig.RegisterRoutes(RouteTable.Routes); 
    } 

私は順序を反転した後、私は私のエリアのルートを登録していることを確認しました:

protected void Application_Start() 
    { 
     RouteConfig.RegisterRoutes(RouteTable.Routes); 
     AreaRegistration.RegisterAllAreas();    
    } 
関連する問題