Переменная сеанса MVC 5 ModelBinder null в методе действия

Я делаю приложение MVC. У меня есть вид, что наследовать от вызова модели UserModel которые имеют 2 свойства. Имя пользователя и пароль. Я хочу сохранить эти значения в переменных сеанса, поэтому я использую ModelBinder,

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

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 Экземпляр из представления является нулевым. Он читает то, что уже имеет мой сеанс вместо чтения представления, а затем сохраняет его в сеансе.

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

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

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

1 ответ

Решение

Вы устанавливаете нулевое значение в 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
}
Другие вопросы по тегам