【问题标题】:ASP.NET MVC 4 validation on complex models - model does not validated on server side复杂模型上的 ASP.NET MVC 4 验证 - 模型未在服务器端验证
【发布时间】:2013-11-09 18:28:19
【问题描述】:

我的问题类似于this question,但我仍然在服务器端和客户端的验证方面遇到问题。我想对设置在不同模型中的两个属性进行比较。

我的模型如下:

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。有人可以帮忙吗?我检查了this question 它有点帮助,但不是完全。

如果我像下面这样更改模型结构,则会收到错误消息: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>

【问题讨论】:

  • 您能否发布您的视图代码和您的Register 操作结果的HttpGet
  • @bump 添加了 View 的代码,如何获取 httpget ?对不起,我是菜鸟,但我是新手。
  • 但是您组织 UserRegisterViewModel 的方式(使用 [Compare("User.Password", ErrorMessage = "Passwords must match")] 是您链接中的确切问题已经提供(另一个问题)。这就是为什么在那里另外引入了一些附加属性“密码”的原因。
  • 因此,如果我这样做,我会收到不同的错误消息,提示密码在服务器端不匹配,更新的问题有错误,但在这两种情况下它都适用于客户端。
  • 实际上,我刚刚尝试了完全相同的代码(第一个块),它在服务器端运行良好。模型验证正确。 (至于密码)。

标签: c# asp.net-mvc validation asp.net-mvc-4


【解决方案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>  

【讨论】:

    【解决方案2】:

    你能检查一下这个article吗?我认为它会对你有所帮助。

    例子:

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

    另外一个one arcticle也可以解决这个问题。

    【讨论】:

      【解决方案3】:

      在您的注册视图中,您需要引用用户模型的密码,而不是 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; }
      }
      

      【讨论】:

      • 我刚刚更新了答案,注释掉[DisplayName("Confirm Password")],再试一次。
      • 不应该这样,因为它只是为了显示目的,还是我遗漏了什么?
      • 我试过你的代码,如果你的视图代码和我的一样,唯一的区别是我在用户模型中为密码添加了“[DataType(DataType.Password)]”。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-26
      • 1970-01-01
      相关资源
      最近更新 更多