0

我有一个适用于管理员和普通用户的“新用户”表单。两种形式都使用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或有其他解决方案吗?

4

1 回答 1

1

手动更新模型时,不需要将其作为 Action 中的参数。此外,使用此重载可让您仅指定将发生绑定的属性。

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

最后是最简单也是最好的方法

定义单独的视图模型

于 2011-10-04T10:30:02.843 回答