2015-03-12 3 views
1

Я пытаюсь изменить текущую культуру пользователя с помощью 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() возвращает не обновленное значение (которое не соответствует значению, которое был обновлен в базе данных)

+0

Вы вытаскиваете текущую культуру пользователя из базы данных на каждом поражении страницы, или вы кешируете ее в переменной сеанса (или пользовательском cookie?) –

+0

Из базы данных на каждой странице попадается. Я еще не настроил файл cookie, хотя это следующий в моем списке. Hehe – projeqht

+0

Эта строка 'Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture = new CultureInfo (культура);' не собирается делать многое, как поток вот-вот закончится при следующем утверждении (return). Насколько я вижу, проблема заключается не в коде, который вы предоставили. –

ответ

-1

Я думаю, вы сначала должны подключить пользователя к своему DbContext.

db.AspNetUsers.Attach(user); 

Затем звоните, сохраняйте изменения. Каждый раз, когда я сталкивался с проблемами, связанными с обновлением моей БД, это было причиной. Я верю, что вам нужно обновить страницу после этого обновления.

+0

Привет @JRT, я просто попробовал это, но это не исправить мою проблему. Спасибо за ваше предложение! – projeqht

0

Брус комментарий пока нет, но вы проверили this other stack overflow question

По этой ссылке кажется, что действие фильтра уже слишком поздно, чтобы установить культуру для запроса.

1

Кажется, что EF не отслеживает ваши изменения. Попробуйте что-то вроде этого,

db.Entry (AspNetUsers) .State = EntityState.Modified;

до: db.SaveChanges();

Также вы запрашиваете контекст _db, пока я вижу, что ваш контекст: private readonly AspEntities db = new AspEntities();

Какие подсказки для ура не установлены правильно? Не знаю, правильно ли я, но проверьте свой контекст.

+0

Слишком поздно ... вы уже сохранили данные в db lol..Such a dummy –

+0

Где ур фильтр? Это действие или контроллер или глобальное? –

0

Проверьте, ссылаетесь ли вы на данные из уже созданного контекста базы данных (AspEntities db) в контроллере, который должен производить обновления. Модификатор readonly предотвратит изменения после объявления, если вы не всегда создаете новый объект контроллера.

Смежные вопросы