(对于TL跳过这个;容灾版(
我正在尝试让用户使用个人资料中的选项设置他的首选语言。我以 99% 的速度完成了所有工作:当用户更新其个人资料并设置 cookie "语言"时,AccountController 会保存区域性。然后,该网站将完美地更改其显示的语言。但是,我仍然需要在用户首次登录时设置网站语言,而无需更新其个人资料来创建cookie。
因此,我正在尝试通过覆盖基本控制器的 Initialize(( 函数来在应用程序周期的早期设置 cookie。问题是我无法访问用户首选项,因为用户管理器为空。有没有办法从baseController的initialize((函数访问保存在数据库中的用户语言首选项?
TL;DR 版本:userManager 在 baseController 的 initialize(( 函数中为空。如何从那里访问当前用户变量?
protected override void Initialize(RequestContext requestContext)
{
try
{
String culture = requestContext.HttpContext.GetOwinContext().Request.Cookies["language"];
if(culture != null)
{
Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo(culture);
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(culture);
}
else
{
if (requestContext.HttpContext.User.Identity.IsAuthenticated)
{
String userName = requestContext.HttpContext.User.Identity.GetUserName();
ApplicationUser user = UserManager.FindByName(userName); //TODO: UserManager is NULLL !!!
HttpCookie language = new HttpCookie("language");
if (user.DefaultLanguage)
{
language.Value = "fr-CA";
}
else
{
language.Value = "en-CA";
}
Response.Cookies.Add(language);
}
}
}
catch (Exception e)
{
}
base.Initialize(requestContext);
}
我刚刚又读了一遍这个问题。我对答案有一些小的变化。
你根本不应该为此使用用户管理器。只需使用该语言向 ClaimsIdentity 添加声明即可。这还可以防止对数据库进行额外调用。
将语言属性添加到应用程序用户。确保将其添加为声明:
public class ApplicationUser : IdentityUser
{
public string Language { get; set; }
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
{
var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
// Add custom user claims here
userIdentity.AddClaim(new Claim("Language", Language));
return userIdentity;
}
}
在初始化中,您可以像这样阅读声明:
protected override void Initialize(RequestContext requestContext)
{
try
{
// Try claims collection first
var culture = (System.Security.Claims.ClaimsIdentity)User.Identity).FindFirst("Language").Value;
// otherwise try cookie
if (culture == null)
culture = requestContext.HttpContext.GetOwinContext().Request.Cookies["language"];
if (culture == null)
{
// user is not logged in and there is no cookie
culture = "fr-CA";
HttpCookie language = new HttpCookie("language");
language.Value = culture;
Response.Cookies.Add(language);
}
Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo(culture);
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(culture);
}
catch (Exception e)
{
}
base.Initialize(requestContext);
}
像这样的东西。仍然没有测试它,但这就是想法。 如果有什么不清楚的地方,请告诉我。