尝试验证并在控制器中手动设置值(ASP MVC 3)

时间:2011-10-04 10:02:56

标签: asp.net-mvc asp.net-mvc-3 model-validation

我为管理员和普通用户都提供了“新用户”表单。两种形式都使用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或者是否有其他解决方案?

1 个答案:

答案 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);
}

最后 最简单,最好的方式

  

定义单独的视图模型