【发布时间】:2015-03-12 16:06:09
【问题描述】:
我正在尝试通过 AJAX POST 更改用户当前的文化:
$.ajax({
type: 'POST',
url: '/Account/SetDefaultCulture',
data: data,
dataType: 'JSON',
success: function (result) {
location.reload(true);
}
});
使用此控制器方法:
private readonly AspEntities db = new AspEntities();
[HttpPost]
public JsonResult SetDefaultCulture(string userName, string culture)
{
if (!userName.IsNullOrEmpty())
{
var user = (from a in _db.AspNetUsers
where a.UserName == userName
select a).FirstOrDefault();
if (user != null)
{
user.Culture = culture;
db.SaveChanges();
Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture = new CultureInfo(culture);
return Json(new { culture, success = true });
}
}
return Json(new {culture, success = false});
}
如果我在调试时单步执行,我可以在调用 db.SaveChanges() 后立即看到数据库记录更新。
问题是应用程序/网站不会更新用户的文化,直到我更改控制器中的一些代码,然后再次构建项目。就好像文化被缓存在应用程序或其他东西中一样。
我一定错过了什么。这很常见吗?有人遇到过吗?
编辑
我正在使用 Utility 方法来检查当前用户的文化:
public static CultureInfo GetCulture()
{
var userId = HttpContext.Current.User.Identity.GetUserId();
var user = (from a in _db.AspNetUsers
where a.Id == userId
select a).FirstOrDefault();
var culture = "en-CA";
if (user != null)
{
if (!user.Culture.IsNullOrEmpty())
{
culture = user.Culture;
}
}
return new CultureInfo(culture);
}
在每个页面点击时运行的过滤器中:
public class CheckCultureAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
HttpContext ctx = HttpContext.Current;
string controllerName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName.ToLower().Trim();
string actionName = filterContext.ActionDescriptor.ActionName.ToLower().Trim();
//Set Culture
var culture = (ctx.User != null) ? Utilities.GetCulture() : new CultureInfo("en-CA");
Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture = culture;
...
}
}
如果我启动调试器并单步执行此过滤器,GetCulture() 方法会返回未更新的值(与数据库中已更新的值不匹配)
【问题讨论】:
-
您是在每次点击页面时从数据库中提取用户当前的文化,还是将其缓存在会话变量(或用户 cookie?)中?
-
从每个页面点击的数据库中。我还没有设置 cookie,虽然这是我的下一个待办事项列表,呵呵
-
这一行
Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture = new CultureInfo(culture);不会做太多事情,因为线程即将在下一个语句(返回)处结束。据我所知,问题不在于您提供的代码。 -
@RobertMcKee 我刚刚使用每次页面加载时运行的过滤器方法更新了问题。我只是尝试在
SetDefaultCulture中的return语句之前设置Culture 作为测试,尽管我知道它会被Filter 方法设置的任何内容覆盖。 -
用户数据正在通过 cookie 或会话进行持久化。它不是在每个页面点击时查找用户。而且由于您将文化数据保存在 AspNetUsers 表中,因此很可能它也被保存在 cookie 或会话中。
标签: c# asp.net asp.net-mvc entity-framework