我正在做一个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?
答案 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
}