unobtrusive client validation using fluentvalidation and asp.net mvc LessThanOrEqualTo not firing

后端 未结 3 1521
花落未央
花落未央 2020-12-02 04:23

I have the following rules

the 1st does work using unobtrusive, client side validation, the second does not

any ideas why?

RuleFor(x => x.         


        
3条回答
  •  予麋鹿
    予麋鹿 (楼主)
    2020-12-02 05:08

    Darin's example has some obsolete stuff in it, so here is a more updated example that I have that does number comparisons. You can easily tweak it for date comparisons though:

    Javascript:

    (function ($)
    {
        $.validator.addMethod("lessthanorequal", function(value, element, param)
        {
            return this.optional(element) || parseFloat(value) <= parseFloat(param);
        }, "Must be less than");
    
        $.validator.unobtrusive.adapters.add("lessthanorequal", ["field"], function (options)
        {
            options.rules["lessthanorequal"] = options.params.field;
            if (options.message) options.messages["lessthanorequal"] = options.message;
        });
    })(jQuery);
    

    C#

    public class LessThanOrEqualPropertyValidator : FluentValidationPropertyValidator
    {
    
        public LessThanOrEqualPropertyValidator(ModelMetadata metadata, ControllerContext controllerContext, PropertyRule rule, IPropertyValidator validator)
            : base(metadata, controllerContext, rule, validator)
        {
        }
    
        public override IEnumerable GetClientValidationRules()
        {
            if (!ShouldGenerateClientSideRules()) yield break;
    
            var formatter = new MessageFormatter().AppendPropertyName(Rule.PropertyName);
            string message = formatter.BuildMessage(Validator.ErrorMessageSource.GetString());
            var rule = new ModelClientValidationRule
            {
                ValidationType = "lessthanorequal",
                ErrorMessage = message
            };
    
             rule.ValidationParameters["field"] =  ((LessThanOrEqualValidator)Validator).ValueToCompare;
            yield return rule;
        }
    }
    

    Global.asax Application_Start:

    FluentValidation.Mvc.FluentValidationModelValidatorProvider.Configure(x =>
    {
        x.Add(typeof(LessThanOrEqualValidator), (metadata, context, description, validator) => new LessThanOrEqualPropertyValidator(metadata, context, description, validator));
    });
    

    So now any number rule that uses LessThanOrEqual will be validated client side.

提交回复
热议问题