如何将文化设置为用户为登录页面选择的文化?

时间:2019-09-16 09:32:26

标签: c# asp.net-mvc authentication localization

我们网站的某些区域需要进行身份验证才能访问。

我们的网站可以选择从任何页面中选择用户的首选语言。

由于某种原因,即使重定向到登录页面,即使选择了一种语言,该语言也会被设置为登录页面上的默认语言。

例如,如果用户在索引页面上(允许匿名)并且选择法语作为他们的语言,然后选择进入数据库门户(需要登录),则会将他们带到默认语言登录页面(英语) 。登录后语言正确。

应该发生的是:应该将用户重定向到以其选择的语言显示的登录页面。

如果在登录页面上选择语言时,登录页面将更改语言。

这是登录名的配置:

<authentication mode="Forms">
    <forms loginUrl="/Home/Login" />
</authentication>

路由配置:

routes.MapRoute(
                name: "Localised",
                url: "{language}/{controller}/{action}/{id}",
                constraints: new {language = @"(\w{2})|(\w{2}-\w{2})" },
                defaults: new {language = "en-GB", controller = "Home", action = "Index", id = UrlParameter.Optional }
               );

routes.MapRoute(
                name: "login",
                url: "Home/Login",
                defaults: new 
                          { 
                              language = CultureInfo.CurrentCulture.TwoLetterISOLanguageName,
                              controller = "Home", 
                              action = "Login"
                          }
               );

我正在使用this method进行本地化。

由于某种原因,即使语言是先前设置的,当前的区域性还是默认区域性。

如何配置路由以使用先前选择的区域性?

1 个答案:

答案 0 :(得分:0)

我当前的解决方案是在LocalizedControllerActivator.Create方法中设置会话变量,以存储会话的区域性,然后在登录请求的处理程序中设置“当前区域性”:

public IController Create(RequestContext requestContext, Type controllerType)
{
    string lang = requestContext.RouteData.Values["language"] as string ?? _DefaultLanguage;

    if (lang != _DefaultLanguage)
    {
        try
        {
            Thread.CurrentThread.CurrentCulture =
            Thread.CurrentThread.CurrentUICulture = new CultureInfo(lang);
            // Store the culture in the session here
            requestContext.HttpContext.Session["culture"] = Thread.CurrentThread.CurrentCulture;
        }
        catch (Exception)
        {
            throw new NotSupportedException(string.Format("ERROR: Invalid language code '{0}'.", lang));
        }
    }

    return DependencyResolver.Current.GetService(controllerType) as IController;
}

public ActionResult Login(UserLogin user = null, string ReturnUrl = "/")
{
    Thread.CurrentThread.CurrentCulture =
    Thread.CurrentThread.CurrentUICulture = Session["culture"] as CultureInfo;

    //do the rest of the login stuff below
    // ...
    return View();
}