2016-05-12 12 views
1

私はマルチ言語のページを持っており、カルチャー情報をクッキーに保存しています。しかし、今私はそれをURLのローカリゼーションに変更します。 URLはMVC WebプロジェクトのURLローカライゼーション

www.domain.com/en/home/indexまたは www.domain.com/fr/home/index

私は解決策の多くを試みたが、何も良い仕事をしないようになっているはずです。今私は解決策を持っていますが、ルートでのみ動作しますが、エリアでは動作しません。 Global.asaxの中

私は

protected void Application_Start() 
    { 
    // ViewEngines.Engines.Clear(); 

     //LocalizedViewEngine: this is to support views also when named e.g. Index.de.cshtml 
     ViewEngines.Engines.Insert(0, new LocalizedViewEngine()); 

     AreaRegistration.RegisterAllAreas(); 

     RegisterGlobalFilters(GlobalFilters.Filters); 
     RegisterRoutes(RouteTable.Routes); 



     WebApiConfig.Register(GlobalConfiguration.Configuration); 
     FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
     //standard mvc4 routing. see App_Start\RouteConfig.cs 
     //RouteConfig.RegisterRoutes(RouteTable.Routes); 
     BundleConfig.RegisterBundles(BundleTable.Bundles); 
     AuthConfig.RegisterAuth(); 
    } 



     public static void RegisterRoutes(RouteCollection routes) 
    { 
     const string defautlRouteUrl = "{controller}/{action}/{id}"; 

     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
     RouteValueDictionary defaultRouteValueDictionary = new RouteValueDictionary(new { controller = "Home", action = "Index", id = UrlParameter.Optional }); 
     routes.Add("DefaultGlobalised", new GlobalisedRoute(defautlRouteUrl, defaultRouteValueDictionary)); 
     routes.Add("Default", new Route(defautlRouteUrl, defaultRouteValueDictionary, new MvcRouteHandler())); 

     //LocalizedViewEngine: this is to support views also when named e.g. Index.de.cshtml 
     routes.MapRoute(
      "Default2", 
      "{culture}/{controller}/{action}/{id}", 
      new 
      { 
       culture = string.Empty, 
       controller = "Home",//ControllerName 
       action = "Index",//ActionName 
       id = UrlParameter.Optional 
      } 
     ).RouteHandler = new LocalizedMvcRouteHandler(); 
    } 

、すべてのようにルートを登録し、私はこれが

public override void RegisterArea(AreaRegistrationContext context) 
    { 
     context.MapRoute(
      "Doc_default", 
      "Doc/{controller}/{action}/{id}", 
      new { action = "Index", id = UrlParameter.Optional } 
     ); 

     //LocalizedViewEngine: this is to support views also when named e.g. Index.de.cshtml 
     context.MapRoute(
      "Doc_default2", 
      "{culture}/Doc/{controller}/{action}/{id}", 
      new 
      { 
       culture = string.Empty, 
       controller = "Doc", 
       action = "Index", 
       id = UrlParameter.Optional 
      } 
     ).RouteHandler = new LocalizedMvcRouteHandler(); 
    } 

を上書きしていAreaRegistration私はこの問題のために時間を費やしたが、私はそれを得ることはありません! MVC URLローカリゼーションのチュートリアルはありますか?

ありがとうございました!

+0

属性ルーティングを使用することができます - [ここの記事を参照](https://blogs.msdn.microsoft.com/webdev/2013/10/17/attribute-routing-in-asp-net-mvc-5/) –

+0

[ルートとURLでのASP.NET MVC 5文化の可能な重複](http://stackoverflow.com/questions/32764989/asp-net-mvc-5-culture-in-route-and-url) – NightOwl888

答えて

0

今私は私のための解決策を持っています。それは素晴らしい作品です。

私はregisterRroutesとRegisterArea

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

     routes.MapRoute(
       name: "Default_Localization", 
       url: "{language}/{controller}/{action}/{id}", 
       defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional, language = string.Empty } 
       ); 
    } 

そして、それのthatsそしてBaseController

protected override IAsyncResult BeginExecuteCore(AsyncCallback callback, object state) 
    { 

     string cultureName; 
     if (RouteData.Values.ContainsKey("language") && !string.IsNullOrWhiteSpace(RouteData.Values["language"].ToString())) 
     { 
      cultureName = RouteData.Values["language"].ToString(); 
     } 
     else 
     { 
      cultureName = Request.UserLanguages != null && Request.UserLanguages.Length > 0 ? CultureHelper.GetNeutralCulture(Request.UserLanguages[0]) : null; 
      cultureName = CultureHelper.GetImplementedCulture(cultureName); 
     } 

     Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(cultureName.ToLower()); 
     Thread.CurrentThread.CurrentUICulture = new CultureInfo(cultureName.ToLower()); 

     return base.BeginExecuteCore(callback, state); 
    } 

    protected override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     base.OnActionExecuting(filterContext); 

     var cultureName = CultureHelper.GetNeutralCulture(CultureHelper.GetCurrentCulture()); 
     cultureName = CultureHelper.GetImplementedCulture(cultureName); 
     filterContext.RouteData.Values["language"] = cultureName.ToUpper(); 
    } 

に今持っています!

関連する問題