0

我正在尝试制作一个验证器,以确保至少选择了 2 个项目。验证器在服务器端正常工作,但客户端代码永远不会被执行。

这是代码:

 Sys.Mvc.ValidatorRegistry.validators["country"] = function (rule) {

        var min = rule.ValidationParameters["min"];        

        return function (value, context) {

            if (value >= min) return true;

            return rule.ErrorMessage;

        };
    };  

这是验证器代码:

  public class CountryValidator : DataAnnotationsModelValidator<CustomValidations.CountryAttribute>
    {
        private int _minimum;
        private string _message; 

        public CountryValidator(ModelMetadata metadata, ControllerContext context, CustomValidations.CountryAttribute attribute) : base(metadata,context,attribute)
        {
            _minimum = attribute.Minimum;
            _message = attribute.ErrorMessage; 
        }

        public override IEnumerable<ModelClientValidationRule> GetClientValidationRules()
        {
            var rule = new ModelClientValidationRule()
            {
                ErrorMessage = _message,
                ValidationType = "country"
            };

            rule.ValidationParameters.Add("min", _minimum);
            return new[] { rule };
        }


    }

我什至在 global.asax 文件中注册了验证适配器:

  protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            RegisterRoutes(RouteTable.Routes);

            DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(AgeAttribute), typeof(AgeValidator));
            DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(CountryAttribute),typeof(CountryValidator));
        }

我认为验证器仅适用于具有 value 属性的元素,如文本框等。

更新 1:

EnableClientValidation 被正确调用,并且所有需要的 JS 文件都包含在项目中。似乎我需要将 onblur 附加到上下文中。我会尝试并发布结果。

4

3 回答 3

0

<% =Html.EnableClientValidation(); %>需要在某个地方出现在您的视野中。还要确保你引用MicrosoftAjax.jsMicrosoftMvcValidation.js在同一个视图中(在你的 js 函数之前)。

于 2010-07-27T19:26:46.630 回答
0

如 Haack 先生的网站http://haacked.com/archive/2009/11/19/aspnetmvc2-custom-validation.aspx中所述,您缺少MicrosoftMvcAjax.js或需要在 jQuery 中实现自定义验证。

于 2010-07-28T05:50:52.303 回答
0

我认为这是因为在输入文本框的 onblur 事件上调用了默认验证。对于一个列表框,这个事件没有被抛出。

于 2010-07-29T15:38:59.263 回答