2017-01-30 5 views
0

Я делаю MVC APP. У меня есть представление «Наследовать от модели» UserModel, которые имеют 2 свойства. Имя пользователя и пароль. Я хочу сохранить эти значения в переменных сеанса, поэтому я использую ModelBinder.MVC 5 Session Variable ModelBinder null для метода действия

Мое определение класса такое.

public class UserModel 
{ 
    public string UserName { get; set; } 
    public string Password { get; set; } 
} 

Мое связующее устройство такое.

public class UserDetailModelBinder : IModelBinder 
{ 

    #region Constants 

    private const string SessionKey = "User"; 

    #endregion 


    #region Public Methods and Operators 

    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     UserModel user = (controllerContext.HttpContext.Session != null) ? (controllerContext.HttpContext.Session[SessionKey] as UserModel) : null; 

     if (user == null) 
     { 
      user = new UserDetail(); 
      controllerContext.HttpContext.Session[SessionKey] = user; 
     } 

     return user; 
    } 

    #endregion 
} 

И я определил должным образом в моем global.asax

Проблема, которую я нашел, что мой Action Method, который получает UserModel экземпляр из View является недействительным. Он читает, что уже имеет мою сессию вместо чтения, а затем сохраните ее в сеансе.

[HttpPost] 
[ValidateAntiForgeryToken] 
public async Task<ActionResult> Login(UserModel model) 
{ 
} 

Я полагаю, это потому, что это та же модель я определил, чтобы сохранить в BinderModel

Итак, мой вопрос будет, как я могу сохранить в сессии, модель унаследует от View с помощью BinderModel?

ответ

1

Вы устанавливаете значение null для UserModel и возвращаетесь. Вы должны прочитать значения из запроса и вернуть его.

var request = controllerContext.HttpContext.Request; 
    if (user == null) 
    { 
     user = new UserModel() { 
      UserName= request.Form.Get("UserName").ToString(), 

      Password = request.Form.Get("Password").ToString() 
     }; 

     controllerContext.HttpContext.Session["User"] = user; 
    } 

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

public async Task<ActionResult> Login(UserModel model) 
{ 
    //Session["User"] = model 
} 
Смежные вопросы