代码之家  ›  专栏  ›  技术社区  ›  griegs

在MVC 2中使用自定义模型绑定器的自定义验证属性

  •  4
  • griegs  · 技术社区  · 14 年前

    我为我包含的代码量道歉。我尽量把它控制在最低限度。

    我试图在我的模型上有一个自定义验证器属性和一个自定义模型绑定器。属性和绑定器分开工作得很好,但是如果两者都有,那么验证属性就不再工作了。

    这是我为可读性而截取的代码。如果省略global.asax中的代码,则会触发自定义验证,但如果启用了自定义绑定器,则不会。

    验证属性;

    public class IsPhoneNumberAttribute : ValidationAttribute
    {
        public override bool IsValid(object value)
        {
            //do some checking on 'value' here
            return true;
        }
    }
    

    在我的模型中使用属性;

        [Required(ErrorMessage = "Please provide a contact number")]
        [IsPhoneNumberAttribute(ErrorMessage = "Not a valid phone number")]
        public string Phone { get; set; }
    

    定制模型活页夹;

    public class CustomContactUsBinder : DefaultModelBinder
    {
        protected override void OnModelUpdated(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {
            ContactFormViewModel contactFormViewModel = bindingContext.Model as ContactFormViewModel;
    
            if (!String.IsNullOrEmpty(contactFormViewModel.Phone))
                if (contactFormViewModel.Phone.Length > 10)
                    bindingContext.ModelState.AddModelError("Phone", "Phone is too long.");
        }
    }
    

    全球ASAX;

    System.Web.Mvc.ModelBinders.Binders[typeof(ContactFormViewModel)] = 
      new CustomContactUsBinder();
    
    1 回复  |  直到 14 年前
        1
  •  6
  •   Darin Dimitrov    14 年前

    确保您正在呼叫 base 方法:

    protected override void OnModelUpdated(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        ContactFormViewModel contactFormViewModel = bindingContext.Model as ContactFormViewModel;
    
        if (!String.IsNullOrEmpty(contactFormViewModel.Phone))
            if (contactFormViewModel.Phone.Length > 10)
                bindingContext.ModelState.AddModelError("Phone", "Phone is too long.");
    
        base.OnModelUpdated(controllerContext, bindingContext);
    }
    
    推荐文章