代码之家  ›  专栏  ›  技术社区  ›  Master Morality

模型状态.IsValidMVC3中的vs IValidTeableObject

  •  15
  • Master Morality  · 技术社区  · 16 年前

    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()

    2 回复  |  直到 16 年前
        1
  •  18
  •   Buildstarted    16 年前

    你只需要把它添加到你正在验证的模型中就可以了。下面是一个验证示例

    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) {
        }
    }
    

    希望这有帮助。其他的需求是.NET4和数据注释—您显然需要jsut来处理ivalidatableobject。发布任何问题,我们将看看是否我们无法解决它们-例如发布您的模型和控制器…您可能遗漏了一些内容。

        2
  •  6
  •   Sergio    11 年前

    使用 DefaultModelBinder 是一个两阶段的过程。第一, Data Annotations 已验证。然后(并且仅当数据注释验证导致零错误时), IValidatableObject.Validate() 被称为。当post操作具有viewmodel参数时,这一切都会自动发生。 ModelState.IsValid 什么都不做。相反,它只是报告 ModelState 集合具有非空 ModelErrorCollection