2013-11-09 119 views
0

我的问题与this question类似,但我仍然在验证服务器端和客户端方面存在问题。我想对两个属性进行比较,并设置在不同的模型中。复杂模型上的ASP.NET MVC 4验证 - 模型未在服务器端进行验证

我的型号如下:

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> 
+0

你能张贴您查看的代码和'HttpGet'你'Register'行动结果? – bump

+0

@bump添加了View的代码,如何获取httpget?对不起,但我是新来的这个。 –

+0

但是你组织你的UserRegisterViewModel的方式(与[Compare("User.Password", ErrorMessage = "Passwords must match")]是你提供的链接的确切问题(另一个问题),这就是为什么另外引入了一些额外的属性“密码” – Agat

回答

-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; } 
} 
+0

我已更新问题,我的我同一个代码用于查看。 –

+0

我刚刚更新了答案,注释掉[DisplayName(“确认密码”)],再试一次。 – Lin

+0

这不应该是这样,因为它只是为了显示目的,还是我错过了什么? –

-1

请你检查这article?我认为它会帮助你。

例子:

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

而另一one arcticle也可以解决问题。

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>