0

私の問題はこの質問に似ていますが、サーバー側とクライアント側の両方の検証にまだ問題があります。異なるモデルに設定された 2 つのプロパティを比較したいと考えています。

私のモデルは次のとおりです。

public class User{
  public string Password { get; set; }
}

public class UserRegisterViewModel {
    public User User{ get; set; }

    //This is suggested in linked question - as Compare can only work with local property
    public string Password 
    {
        get{return this.User.Password;}
    }

    [DataType(DataType.Password)]
    [Compare("Password", ErrorMessage = "Passwords must match")]
    [Required(ErrorMessage = "Confirm password is required")]
    [DisplayName("Confirm Password")]
    public string CPassword { get; set; }
}

私のコントローラーのアクションは次のとおりです。

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Register(UserRegisterViewModel model)
{
    if (ModelState.IsValid) //This conditions is false
    {
    }
    return View(); 
}

という検証エラーで再度登録ページにリダイレクトされますPassword must match。誰か助けてくれませんか?この質問を確認しましたが、少しは役に立ちましたが、完全ではありませんでした。

以下のようにモデル構造を変更すると、次のようなエラーが表示されますCould not find a property named User.Password

public class UserRegisterViewModel {
    public User User{ get; set; }

    [DataType(DataType.Password)]
    [Compare("User.Password", ErrorMessage = "Passwords must match")]
    [Required(ErrorMessage = "Confirm password is required")]
    [DisplayName("Confirm Password")]
    public string CPassword { get; set; }
}

編集

私のcshtmlページコードは以下のようなものです。

<p>
    @Html.LabelFor(model => model.User.Password)
    @Html.PasswordFor(model => model.User.Password, new { @class = "wd189 inputtext" })
    @Html.ValidationMessageFor(model => model.User.Password)
</p>
<p>
    @Html.LabelFor(model => model.CPassword)
    @Html.PasswordFor(model => model.CPassword, new { @class = "wd189 inputtext" })
    @Html.ValidationMessageFor(model => model.CPassword)
</p>
4

3 に答える 3

1

これは私にとってはうまくいきました(クライアント側とサーバー側の両方で)。

public class UserRegisterViewModel
{
    private User _user;

    public User User
    {
        get { return _user = (_user ?? new User()); }
    }

    public string Password
    {
        get { return User.Password; }
        set { User.Password = value; }
    }

    [DataType(DataType.Password)]
    [System.Web.Mvc.Compare("Password", ErrorMessage = "Passwords must match")]
    [Required(ErrorMessage = "Confirm password is required")]
    [DisplayName("Confirm Password")]
    public string CPassword { get; set; }
}

編集:

明らかに、ビューは次のようにする必要があります。

<p>
    @Html.LabelFor(model => model.Password)
    @Html.PasswordFor(model => model.Password, new { @class = "wd189 inputtext" })
    @Html.ValidationMessageFor(model => model.Password)
</p>
<p>
    @Html.LabelFor(model => model.CPassword)
    @Html.PasswordFor(model => model.CPassword, new { @class = "wd189 inputtext" })
    @Html.ValidationMessageFor(model => model.CPassword)
</p>  
于 2013-11-09T19:52:44.897 に答える
-1

登録ビューでは、 UserRegisterViewModel モデルのパスワードではなく、ユーザー モデルのパスワードを参照する必要があります。以下のように:

@model  UserRegisterViewModel

@Html.LabelFor(model => model.User.Password)
@Html.EditorFor(model => model.User.Password)
@Html.ValidationMessageFor(model => model.User.Password)

@Html.LabelFor(model => model.CPassword)
@Html.EditorFor(model => model.CPassword)
@Html.ValidationMessageFor(model => model.CPassword)

public class User
{
    [DataType(DataType.Password)]
    public string Password { get; set; }
}

public class UserRegisterViewModel
{
    public User User { get; set; }
    public string Password{get { return this.User.Password; }}

    [DataType(DataType.Password)]
    [Compare("Password", ErrorMessage = "Passwords must match")]
    [Required(ErrorMessage = "Confirm password is required")]
    [DisplayName("Confirm Password")]
    public string CPassword { get; set; }
}
于 2013-11-09T19:01:52.747 に答える
-1

この記事をチェックしていただけますか?お役に立てると思います。

例:

public class RegisterModelValidator : AbstractValidator<RegisterModel>
{
    public RegisterModelValidator()
    {
        RuleFor(x => x.UserName)
            .NotNull();
        RuleFor(x => x.ConfirmPassword)
            .Equal(x => x.User.Password);
    }
}

また、別のアークティクルでも問題を解決できます。

于 2013-11-09T19:18:31.283 に答える