2012-08-01 48 views
2

我有下面的代码MVC比较属性不工作在服务器端

[Required] 
[StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 8)] 
[Display(Name = "Password")] 
[DataType(DataType.Password)] 
public string Password { get; set; } 

[Required] 
[DataType(DataType.Password)] 
[Display(Name = "Confirm password")] 
[StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 8)] 
[Compare("Password", ErrorMessage = "The password and confirmation password do not match.")] 
public string ConfirmPassword { get; set; } 

当我表现形式,在客户端验证工作,但是当我测试它在服务器端,它总是有效(试着用密码= pass1234和ConfirmPassword = nonmatchingpassword)

我也尝试了一些其他的属性,如在http://foolproof.codeplex.com/等EqualTo但同样的问题。

我已经包括方法

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Register(RegisterViewModel model) 
{ 
    if (WebSecurity.IsAuthenticated) 
    { 
     return RedirectToAction("Index", "Home"); 
    } 

    if (ModelState.IsValid) 
    { 
     // register user... 
    } 

    model.Countries = this.Countries.FindAll().OrderBy(c => c.Name); 
    return View(model); 
} 

,这是我如何使它

@using (Html.BeginForm(null, null, FormMethod.Post, new { @class = "form", @id = "register-form" })) 
{ 
@Html.AntiForgeryToken() 
<ul class="form-fields"> 
    ... 
    <li class="form-field"> 
     @Html.LabelFor(m => m.Password) 
     @Html.ValidationMessageFor(m => m.Password) 
     @Html.EditorFor(m => m.Password) 
    </li> 
    <li class="form-field"> 
     @Html.LabelFor(m => m.ConfirmPassword) 
     @Html.ValidationMessageFor(m => m.ConfirmPassword) 
     @Html.EditorFor(m => m.ConfirmPassword) 
    </li> 
    ...  
    <li class="form-actions"> 
     <button class="submit">register</button> 
    </li> 
</ul> 
} 

任何想法可能是错误的?我使用MVC4 RC。

+0

你能发布相关的控制器操作吗? – 2012-08-01 20:16:37

+0

尝试流利的验证http://fluentvalidation.codeplex.com/。 Theres还为MVC http://nuget.org/packages/FluentValidation.MVC3提供了nuget包。 – cubski 2012-08-01 20:19:46

+0

你如何在视图中渲染它? – Shyju 2012-08-01 20:23:29

回答

1

这是微软如何做它的默认MVC项目模板:

[PropertiesMustMatch("Password", "ConfirmPassword", ErrorMessage = "The     password and confirmation password do not match.")] 
    public class RegisterModel 
    { 
     [Required] 
     [DisplayName("User name")] 
     public string UserName { get; set; } 

     [Required] 
     [DataType(DataType.EmailAddress)] 
     [DisplayName("Email address")] 
     public string Email { get; set; } 

     [Required] 
     [ValidatePasswordLength] 
     [DataType(DataType.Password)] 
     [DisplayName("Password")] 
     public string Password { get; set; } 

     [Required] 
     [DataType(DataType.Password)] 
     [DisplayName("Confirm password")] 
     public string ConfirmPassword { get; set; } 
} 

我不知道你究竟是如何做你的服务器端测试。如果这不适合你,也许你可以发布失败的测试?

0

在第二项上取出StringLength。你不需要它,因为第一个项目已经有了它。

+0

不,同样的问题。 – FrEaKmAn 2012-08-01 20:23:36

+1

@FrEaKmAn - 你也不需要所需的。 – 2012-08-01 20:27:23

0

晚会有点晚,但我只是碰到类似的问题。这是由jquery unobstrusive JavaScript文件中的错误引起的。更高版本将修复它,我只是跑

Install-Package jQuery.Validation.Unobtrusive

里面装V2,这对我来说工作正常。你的旅费可能会改变。

此问题已经正确地回答here