所以根据
Gu的IValidatableObject.Validate()应该被调用时控制器验证它的模型(即在ModelState.IsValid之前),但是简单地使模型实现IValidatableObject似乎不起作用,因为Validate(..)不被调用.
任何人都知道有没有其他的东西要连线,让这个工作?
编辑:
这是所要求的代码.
public class LoginModel : IValidatableObject { [required] [Description("Email Address")] public string Email { get; set; } [required] [Description("Password")] [DataType(DataType.Password)] public string Password { get; set; } [DisplayName("Remember Me")] public bool RememberMe { get; set; } public int UserPk { get; set; } public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) { var result = DataContext.Fetch( db => { var user = db.Users.FirstOrDefault(u => u.Email == Email); if (user == null) return new ValidationResult("That email address doesn't exist."); if (user.Password != User.CreateHash(Password,user.Salt)) return new ValidationResult("The password supplied is incorrect."); UserPk = user.UserPk; return null; }); return new List<ValidationResult>(){ result }; } }
那个行动. (我没有做任何特别的控制器…)
[HttpPost] public ActionResult Login(LoginModel model) { if (ModelState.IsValid) { FormsAuthentication.SetAuthCookie(model.Email,model.RememberMe); return Redirect(Request.UrlReferrer.AbsolutePath); } if (ControllerContext.IsChildAction || Request.IsAjaxRequest()) return View("LoginForm",model); return View(model); }
我在LoginModel.Validate()的第一行设置了一个断点,似乎没有得到命中.
解决方法
没有什么比你只需要添加到你验证的模型.这是一个验证的例子
public class User : IValidatableObject { public Int32 UserID { get; set; } public string Name { get; set; } public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) { //do your validation return new List<ValidationResult>(); } }
你的控制器会使用这个模型
public ActionResult Edit(User user) { if (ModelState.IsValid) { } }
希望这可以帮助.其他要求是.net 4和数据注释 – 你显然需要jsut for ivalidatable对象.发布任何问题,我们会看到我们是否无法解决问题,例如发布您的模型和控制器,您可能会缺少某些东西.