RouteConfig.cs überschreibt Cookie?!

iLu_is_a_loser

Erfahrenes Mitglied
Guten Tag

ich habe ein Problem. Und zwar versuche ich gerade eine Lokalisierung mit Routing zu realisieren.
Wenn ich eine Kultur in der RouteConfig.cs übergebe wird diese immer geladen, obwohl ggf. eine aus einem Cookie geladen werden sollte.
Wenn ich dort keine Übergebe bekomme ich nur Fehlermeldungen.

Weiß vielleicht jemand wie ich es schaffe die RouteConfig.cs so abzuändern, dass der Route "culture" erst später gesetzt werden kann?

Hier mein Code:

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

            routes.MapRoute(
                name: "Default",
                url: "{culture}/{controller}/{action}/{id}",
                defaults: new { culture = "DE", controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
        }

global.asax
Code:
        protected void Application_AcquireRequestState(object sender, EventArgs e)
        {    
            var handler = Context.Handler as MvcHandler;    
            var routeData = handler != null ? handler.RequestContext.RouteData : null;
            var routeCulture = routeData != null ? routeData.Values["culture"].ToString() : null;    
            var languageCookie = HttpContext.Current.Request.Cookies["lang"];    
            var userLanguages = HttpContext.Current.Request.UserLanguages;     
            
            // Set the Culture based on a route, a cookie or the browser settings,               
            // or default value if something went wrong   
            var cultureInfo = new CultureInfo(       
                routeCulture **** (languageCookie != null          
                ? languageCookie.Value          
                : userLanguages != null              
                ? userLanguages[0]              
                : "DE")   
                );  
   
            Thread.CurrentThread.CurrentUICulture = cultureInfo;    
            Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(cultureInfo.Name);
        }
Die 4 * sollten 2 ? sein. Keine Ahnung warum er das hier nicht übernehmen will -.-

HomeController.cs
Code:
        public ActionResult ChangeCulture(string lang) 
        {
            var langCookie = new HttpCookie("lang", lang) 
            { 
                HttpOnly = true,
                Expires = DateTime.Now.AddYears(2)
            }; 
            Response.AppendCookie(langCookie); 
            
            return RedirectToAction("Index", "Home", new { culture = lang }); 
        }

Ich hoffe mir kann jemand helfen.
 
Zuletzt bearbeitet:
Problem konnte ich selber lösen.

Habe die RouteConfig.cs wie folgt abgeändert:
Code:
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

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

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

und die global.asax
Code:
        protected void Application_AcquireRequestState(object sender, EventArgs e)
        {
            var handler = Context.Handler as MvcHandler;    
            var routeData = handler != null ? handler.RequestContext.RouteData : null;
            var routeCulture = routeData.Values["culture"] != null ? routeData.Values["culture"].ToString() : null;
            HttpCookie cookie = Request.Cookies["REHAU"];
            var languageCookie =  cookie != null ? cookie["language"] : null;
            var userLanguages = HttpContext.Current.Request.UserLanguages;    
        
            // Set the Culture based on a route, a cookie or the browser settings,               
            // or default value if something went wrong   
            var cultureInfo = new CultureInfo(
                routeCulture != null ? routeCulture
                : languageCookie != null
                ? languageCookie
                : userLanguages != null
                ? userLanguages[0]
                : "en"
                );
   
            Thread.CurrentThread.CurrentUICulture = cultureInfo;    
            Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(cultureInfo.Name);
        }

Ich denke das Problem lag an var routeCulture = routeData != null ? routeData.Values["culture"].ToString() : null;, da ich dort nicht explizit nach culture gesucht habe. Als ich als Standart nämlich eine übergeben habe gings nämlich ;)
 
Zurück