我为管理员和普通用户都提供了“新用户”表单。两种形式都使用RegisterModel
public class RegisterModel
{
[Required]
public string Name { get; set; }
public string Email { get; set; }
[Required]
public string Password { get; set; }
}
不同之处在于我的前端“新用户”页面我希望用户提供自己的密码。但在后端,我希望系统生成密码。
由于我对两种表单都使用了相同的RegisterModel
,因此我在后端收到了Password is required.
的验证错误。
我想,我可以通过将它添加到我的控制器来解决这个问题:
[HttpPost]
public ActionResult New(RegisterModel model)
{
model.Password = Membership.GeneratePassword(6, 1);
if (TryValidateModel(model))
{
// Do stuff
}
return View(model);
}
但我仍然收到错误消息Password is required.
。当我在控制器中调用TryValidate
时,为什么会出现这个问题?
此问题的最佳做法是什么,创建单独的RegisterModelBackEnd
或者是否有其他解决方案?
答案 0 :(得分:1)
手动更新模型时,无需在Action中将其用作参数。另外,使用this overload,只允许您指定将发生绑定的属性。
protected internal bool TryUpdateModel<TModel>(
TModel model,
string[] includeProperties
)
where TModel : class
因此,工作代码将是
[HttpPost]
public ActionResult New()
{
RegisterModel model = new RegisterModel();
model.Password = Membership.GeneratePassword(6, 1);
if (TryValidateModel(model, new string[] {"Name", "Email"}))
{
// Do stuff
}
return View(model);
}
您可以使用BindAttribute
使这更简单[HttpPost]
public ActionResult New([Bind(Exlude="Password")]RegisterModel model)
{
if(ModelState.IsValid)
{
model.Password = Membership.GeneratePassword(6, 1);
// Do Stuff
}
return View(model);
}
最后 最简单,最好的方式
定义单独的视图模型