MVC 5会话变量ModelBinder在Action方法上为null

时间:2017-01-30 15:45:55

标签: asp.net-mvc session controller imodelbinder

我正在做一个MVC APP。我有一个View,它继承自具有2个属性的模型调用UserModel。用户名和密码。我想在Session变量中保存这些值,所以我使用的是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中正确定义了

我发现的问题是从View中收到Action Method实例的UserModel为空。它会读取已有的Session而不是Read the View,然后将其保存在Session中。

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

我想这是因为它与我在BinderModel

中保存的模型相同

所以,我的问题是,如何在Session中保存,模型继承自使用BinderModel的View?

1 个答案:

答案 0 :(得分: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
}