Я пытаюсь изменить текущую культуру пользователя с помощью AJAX POST:db.SaveChanges Сохраняет запись в базе данных, но приложения не обновляет
$.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()
.
Проблема заключается в том, что приложение/веб-сайт не обновляет культуру пользователя до тех пор, пока я не изменю какой-либо код в контроллере, а затем снова создадим проект. Это похоже на то, что Культура кэшируется в приложении или что-то в этом роде.
Должно быть, что-то не хватает. Это распространено? Кто-нибудь сталкивался с этим?
EDIT
Я использую метод Утилита для проверки культуры текущего пользователя:
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;
...
}
}
If I запустите отладчик и пройдите через этот фильтр, метод GetCulture()
возвращает не обновленное значение (которое не соответствует значению, которое был обновлен в базе данных)
Вы вытаскиваете текущую культуру пользователя из базы данных на каждом поражении страницы, или вы кешируете ее в переменной сеанса (или пользовательском cookie?) –
Из базы данных на каждой странице попадается. Я еще не настроил файл cookie, хотя это следующий в моем списке. Hehe – projeqht
Эта строка 'Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture = new CultureInfo (культура);' не собирается делать многое, как поток вот-вот закончится при следующем утверждении (return). Насколько я вижу, проблема заключается не в коде, который вы предоставили. –