2011-07-20 23 views
2

我有一個實體的代碼創建使用EF 4:使用DataAnnotations來驗證模型,不工作

[MetadataType(typeof(MemberMetaData))] 
public partial class Member 
{ 
    public string ConfirmPassword { get; set; } 

    [PropertiesMustMatch("Password", "ConfirmPassword", ErrorMessage = "Password and confirm password do not match.")] 
    public class MemberMetaData 
    { 
     [Required(ErrorMessage = "Email is required.")] 
     [DataType(DataType.EmailAddress, ErrorMessage = "Email is invalid.")] 
     //[RegularExpression(@"^([0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,9})$")] 
     public object Email { get; set; } 

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

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

在會員單位會員性質的電子郵件和密碼爲止。

我試圖使用該數據的註釋以返回一個驗證消息發送回視圖和已創建了一個單元測試像這樣:

[TestMethod] 
    public void register_post_displays_error_when_email_not_entered() 
    { 
     // Arrange 
     Member model = new Member() 
     { 
      Email = "", 
      Password = "test123", 
      ConfirmPassword = "test123" 
     }; 
     // Act 
     var result = _controller.Register(model) as ViewResult; 
     // Assert 
     Assert.AreEqual("Email is required.", result.ViewData.ModelState["Email"].Errors[0].ErrorMessage); 
    } 

這出現故障,當我一步到控制器的ModelState。 IsValid總是如此。這是我的控制器操作:

[HttpPost] 
     public ActionResult Register(Member model) 
     { 
      if (ModelState.IsValid) 
      { //register 
      } 

      // If we got this far, something failed, redisplay form 
      return View("Register"); 
     } 

爲什麼這不起作用?

+0

只是一個更新的命名空間在我的部分類匹配的是我的實體的做到這一點。 – lloydphillips

回答

2

看看這個tutorial

模型綁定不被調用,從而驗證沒有發生。

可以使用手動以下

var validationContext = new ValidationContext(user, null, null); 
var validationResults = new List<ValidationResult>(); 
Validator.TryValidateObject(user, validationContext, validationResults); 
foreach (var validationResult in validationResults) 
{ 
    controller.ModelState.AddModelError(validationResult.MemberNames.First(), validationResult.ErrorMessage); 
} 
+0

謝謝Aros,我設法通過在檢查ModelState.IsValid之前添加TryValidateModel(模型)來在今天早上/今天早上得到這個工作。這與您提供的解決方案有何不同,我是否會不必要地調用它? – lloydphillips

+0

做同樣的事情,代碼少得多,它只是執行模型綁定,然後調用驗證。但是這意味着你現在在你的控制器(框架自動和手動)綁定模型兩次?而上面的代碼不會爲控制器添加額外的代碼來進行測試? –