2017-01-03 1 views
0

В моем приложении MVC MVC пользователи из другой системы с URL-адресом, который содержит свой собственный UserId. В первоначальном запросе пользователей после процесса аутентификации языковой параметр пользователя синхронизируется с соответствующим значением cookie.Asp.Net MVC Cookie Cookie Изменения, но не язык интерфейса пользователя до второго обновления

[HttpPost] 
    [AllowAnonymous] 
    public JsonResult Login(Guid userId, UserType userType) 
    { 
     try 
     { 
      IAccount account = null; 

      if (userType == UserType.SystemUser) 
       account = _accountService.CheckSystemUser(userId); 
      if (userType == UserType.Employee) 
       account = _accountService.CheckEmployee(userId); 

      if (account == null) throw new Exception(ErrorMessages.UserNotFound); 

      var roles = account.Roles.ToArray(); 

      var principalModel = new CustomPrincipalViewModel 
      { 
       UserId = account.UserId.ToString(), 
       FullName = account.FullName, 
       Roles = roles, 
       Language = account.Language 
      }; 

      var userData = JsonConvert.SerializeObject(principalModel); 
      var ticket = new FormsAuthenticationTicket(1, principalModel.FullName, DateTime.Now, 
       DateTime.Now.AddMinutes(30), false, userData); 
      var encryptedTicket = FormsAuthentication.Encrypt(ticket); 
      var requestCookie =Request.Cookies[FormsAuthentication.FormsCookieName]; 
      if (requestCookie != null) requestCookie.Expires = DateTime.Now.AddDays(-1); 
      var responseCookie =Response.Cookies[FormsAuthentication.FormsCookieName]; 
      if(responseCookie != null) responseCookie.Expires = DateTime.Now.AddDays(-1); 
      var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket); 
      Response.Cookies.Add(cookie); 

      SetCulture(account.Language.CultureCode); 

      return Json(new {isSuccess = true, userFullName = account.FullName}); 

     } 
     catch (BusinessExceptions.CannotConnectToCrmServiceException ex) 
     { 
      ElmahManager.Log(ex); 
      return Json(new { isSuccess = false, errorText = ErrorMessages.GeneralError }); 
     } 
     catch (Exception exception) 
     { 
      ElmahManager.Log(exception); 
      return Json(new { isSuccess = false, errorText = ErrorMessages.GeneralError }); 
     } 
    } 

    private void SetCulture(string culture) 
    { 
     culture = CultureHelper.GetImplementedCulture(culture); 
     var requestCookie =Request.Cookies["_culture"]; 
     if (requestCookie != null) requestCookie.Expires = DateTime.Now.AddDays(-1); 


     var cultureCookie = Request.Cookies["_culture"]; 
     if (cultureCookie == null) 
     { 
      cultureCookie = new HttpCookie("_culture") 
      { 
       Value = culture, 
       Expires = DateTime.Now.AddYears(1) 
      }; 
     } 
     else 
     { 
      cultureCookie.Value = culture; 
      cultureCookie.Expires = DateTime.Now.AddYears(1); 
     } 
     Response.Cookies.Add(cultureCookie); 
     Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(culture); 
     Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture; 
    } 

После этого процесса, когда я изменить выбор языка пользователя из базы данных и обновите страницу, язык страницы не меняется. Тем временем, когда я проверяю значение cookie, я вижу, что это то же самое, что и текущее значение языка, но язык страницы не изменяется, пока страница не обновится во второй раз.

+0

Вы имеете в виду, что после того, как пользователь Login() имеет язык по умолчанию, только после обновления вы можете получить соответствующий язык? –

+0

И почему это изменилось? Результатом метода Login является json (вероятно, вызванный AJAX) - поэтому вызов метода входа, который устанавливает куки-файл культуры, не заставляет обновлять страницу. –

+0

Вы правы @MaxMokrousov –

ответ

0

Вы должны изменить

public JsonResult Login(Guid userId, UserType userType) 

в

public ActionResult Login(Guid userId, UserType userType) 

и вернуться View или Перенаправление.

[HttpPost] 
[AllowAnonymous] 
public ActionResult Login(Guid userId, UserType userType) 
{ 
    try{ 

    //Your logic 
    return View(new {isSuccess = true, userFullName = account.FullName}); 
    } 
    catch (BusinessExceptions.CannotConnectToCrmServiceException ex) 
    { 
     ElmahManager.Log(ex); 
     return View(new { isSuccess = false, errorText = ErrorMessages.GeneralError }); 
    } 
    catch (Exception exception) 
    { 
     ElmahManager.Log(exception); 
     return View(new { isSuccess = false, errorText = ErrorMessages.GeneralError }); 
    } 
} 
+0

Мой предыдущий код был тем, что вы сказали. Тем не менее, клиент сказал, что они слишком долго ждали, чтобы пользователи вошли в систему при первом открытии приложения и увидели пустой экран. После этого я сменил свой код так, чтобы мой код сразу вернулся к просмотру и выполнял все другие операции с помощью ajax-запросов. Как вы это сделаете таким образом, чтобы пользователи оставались на экране загрузки и одновременно загружали страницу на новый язык? –

+0

@ Yusuf Duyar Я бы предпочел вам исследовать проблему производительности, чем сделать ajax. Но если вы хотите сделать запрос ajax, вы должны вызвать location.reload(); в обратном вызове. –

+0

Спасибо за объяснение :) Я изменил процесс аутентификации и вернул представление из этого действия. –

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