2014-06-26 3 views
0

Привет, мы разрабатываем веб-приложение с использованием mvc4 и jquery mobile. В нашем контроллере мы создали пользовательский сеанс, как показано ниже.Признание значения из глобальной переменной в MVC

общественный класс HomeController: BaseController { private static User UserUser;

public ActionResult Index(string name) 
    { 
     CurrentUser = (User)Session["CurrentUserSession"]; 
     return View(); 
    } 

    public ActionResult UserDetaiks() 
    { 
     string username = CurrentUser.UserFName; 
     return View() 
    } 

}

  Above we created object for User model and assigned session value in index method. But the value in CurrentUser is lost once i entered UserDetails. So i Used static while creating object. My question is it correct? or anyother way is there. Please guide me. 

Спасибо, ребята еще один Сомнение,

Я использовал ниже код в виде Authenticate.

HttpCookie authCookie = Request.Cookies[FormsAuthentication.FormsCookieName]; 
       if (authCookie != null) 
       { 

        FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value); 

        var s = new System.Web.Script.Serialization.JavaScriptSerializer(); 
        User obj = s.Deserialize<User>(authTicket.UserData); 

        UserInformation CurrentUser = new UserInformation(obj.UserID); 
        CurrentUser.UserId = obj.UserID; 
        CurrentUser.FirstName = obj.UserFName; 
        CurrentUser.LastName = obj.UserLName; 
        CurrentUser.roles = obj.SecurityGroupName; 
        CurrentUser.DefaultWarehouseId = obj.DefaultWhseIdentity; eg:14 
        HttpContext.Current.User = CurrentUser; 

       } 



**Here User can Change CurrentUser.DefaultWarehouseId later like CurrentUser.DefaultWarehouseId = 16. but when i leave the method. It again getting value 14. Now i can code so CurrentUser.DefaultWarehouseId will be 16 through out app one i changed, Please guide me.** 
+1

почему вы создаете это глобальный вы можете получить его из сессии в действие локально при необходимости –

+0

Кроме того, нет CurrentUser, если вы посещаете детали непосредственно, не посещая индекс первого, потому что нет никакого присваивания происходит. – Marco

+0

Пробовал ли вы это с двумя разными пользователями? Использование 'static' не будет работать. – CodeCaster

ответ

1

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

+0

, но если я выберу пользователя из сеанса по мере необходимости. то я заставил написать много избыточного кода. Будущие изменения будут очень сложными. – Ryder

+1

Вы можете поместить некоторый код в базовый класс (полученный от контроллера), который извлекает пользователя из сеанса и помещает его в свойство, например. Затем выведите свой UserController из базового класса. В зависимости от вашего сценария другим вариантом может быть использование ActionFilter. – Mats

+0

thaks bro im going применяется подход конструктора. см. мой обновленный пост. – Ryder

0

Initialize в конструкторе:

public class HomeController : BaseController 
{ 
    private User CurrentUser; 

    public HomeController() 
    { 
     CurrentUser = Session["CurrentUserSession"] as User; 
    } 

    public ActionResult Index(string name) 
    {  
     return View(); 
    } 

    public ActionResult UserDetaiks() 
    { 
     string username = CurrentUser.UserFName; 
     return View() 
    } 
} 
+0

спасибо много. Еще одно сомнение. Я использовал проверку подлинности в моем веб-приложении. В global.asax Application_PostAuthenticateRequest я использовал код ниже. UserInformation CurrentUser = new UserInformation (obj.UserID); CurrentUser.FirstName = obj.UserFName; CurrentUser.DefaultWarehouseId = obj.DefaultWhseIdentity.ToString(); HttpContext.Current.User = CurrentUser; Здесь пользователь может изменить CurrentUser.DefaultWarehouseId, когда он захочет. но им не удалось присвоить значение за пределами global.asx – Ryder

+0

, пожалуйста, см. мой обновленный пост bro. – Ryder

+0

: m получение null исключение внутри конструктора. Я создал сеанс в базовом контроллере. В конструкторе внутреннего контроллера он показывает сеанс равным нулю. – Ryder

1

На мой взгляд, этот вопрос лучше всего подходит на Просмотр Кода, но здесь мы идем:

Ваш код требует от пользователя посетить Index первую присвоить значение для Вашего переменная currentuser. Если пользователь сначала посетит данные, вы получите NullReferencEception.

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

public class HomeController : BaseController 
{ 
    public ActionResult Index(string name) 
    { 
     User CurrentUser = (User)Session["CurrentUserSession"]; 
     return View(); 
    } 

    public ActionResult UserDetails() 
    { 
     User CurrentUser = (User)Session["CurrentUserSession"]; 
     string username = CurrentUser.UserFName; 
     return View() 
    } 
} 

ИЛИ:

public class HomeController : BaseController 
{ 
    private static User CurrentUser; 
    public HomeController() 
    { 
     CurrentUser = (User)Session["CurrentUserSession"]; 
    } 
    /* ... */ 
} 

В любом случае вы должны проверить, если переменная Session не является нулевым. Я полагаю, что если пользователь не вошел в систему, это может стать неприятным.

+0

см. Мой обновленный пост bro. – Ryder

+0

Вы попытались отредактировать мой ответ. Если вы хотите прокомментировать это, используйте функцию комментария. – Marco

+0

хорошо, пожалуйста, посмотрите мой обновленный пост bro. – Ryder

0

Альтернативный способ инкапсуляции логики Geting текущего пользователя - с помощью пользовательских ModelBinder Например:

public class UserBinders : System.Web.Mvc.IModelBinder 
{ 
     private const string SessionKey = "CurrentUser"; 

     public object BindModel(ControllerContext controllercontext, System.Web.Mvc.ModelBindingContext bindingContext) 
     { 
      HttpContextWrapper httpcontext = new HttpContextWrapper(System.Web.HttpContext.Current); 
      string userLogin = httpcontext.User.Identity.Name 

      var currentUser = (User)controllercontext.HttpContext.Session[SessionKey]; 
      if (currentUser == null) 
      { 
       currentUser = context.GetUserByLogin(userLogin); 
       controllercontext.HttpContext.Session[SessionKey] = currentUser; 
      } 

      return currentUser; 
     } 
} 

Просто объявить переменную типа пользователя и получить текущего пользователя.

public ActionResult UserDetaiks(User CurrentUser) 
{ 
    string username = CurrentUser.UserFName; 
    return View() 
} 
Смежные вопросы