数据注释 – MVC3中的ModelState.IsValid vs IValidateableObject

前端之家收集整理的这篇文章主要介绍了数据注释 – MVC3中的ModelState.IsValid vs IValidateableObject前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
所以根据 Gu的IValidatableObject.Validate()应该被调用时控制器验证它的模型(即在ModelState.IsValid之前),但是简单地使模型实现IValidatableObject似乎不起作用,因为Validate(..)不被调用.

任何人都知道有没有其他的东西要连线,让这个工作?

编辑:

这是所要求的代码.

  1. public class LoginModel : IValidatableObject
  2. {
  3. [required]
  4. [Description("Email Address")]
  5. public string Email { get; set; }
  6.  
  7. [required]
  8. [Description("Password")]
  9. [DataType(DataType.Password)]
  10. public string Password { get; set; }
  11.  
  12. [DisplayName("Remember Me")]
  13. public bool RememberMe { get; set; }
  14.  
  15. public int UserPk { get; set; }
  16.  
  17. public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
  18. {
  19. var result = DataContext.Fetch( db => {
  20.  
  21. var user = db.Users.FirstOrDefault(u => u.Email == Email);
  22.  
  23. if (user == null) return new ValidationResult("That email address doesn't exist.");
  24. if (user.Password != User.CreateHash(Password,user.Salt)) return new ValidationResult("The password supplied is incorrect.");
  25.  
  26. UserPk = user.UserPk;
  27. return null;
  28. });
  29.  
  30. return new List<ValidationResult>(){ result };
  31. }
  32. }

那个行动. (我没有做任何特别的控制器…)

  1. [HttpPost]
  2. public ActionResult Login(LoginModel model)
  3. {
  4. if (ModelState.IsValid)
  5. {
  6. FormsAuthentication.SetAuthCookie(model.Email,model.RememberMe);
  7. return Redirect(Request.UrlReferrer.AbsolutePath);
  8. }
  9.  
  10. if (ControllerContext.IsChildAction || Request.IsAjaxRequest())
  11. return View("LoginForm",model);
  12.  
  13. return View(model);
  14. }

我在LoginModel.Validate()的第一行设置了一个断点,似乎没有得到命中.

解决方法

没有什么比你只需要添加到你验证的模型.这是一个验证的例子
  1. public class User : IValidatableObject {
  2. public Int32 UserID { get; set; }
  3. public string Name { get; set; }
  4.  
  5. public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) {
  6. //do your validation
  7.  
  8. return new List<ValidationResult>();
  9. }
  10. }

你的控制器会使用这个模型

  1. public ActionResult Edit(User user) {
  2. if (ModelState.IsValid) {
  3. }
  4. }

希望这可以帮助.其他要求是.net 4和数据注释 – 你显然需要jsut for ivalidatable对象.发布任何问题,我们会看到我们是否无法解决问题,例如发布您的模型和控制器,您可能会缺少某些东西.

猜你在找的asp.Net相关文章