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

モデルを手動で更新する場合、アクションのパラメータとして使用する必要はありません。また、バインドが発生するプロパティのみを指定できるこのオーバーロードを使用します。

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 に答える