Clientside Validation in “Self Validate Model” in ASP.NET-MVC3

前端 未结 1 839
一向
一向 2020-12-19 18:57

This is a followup question for this one: How does DataAnnotations really work in MVC? There is an example custom validation, and a \"Self Validate Model\" was mentioned. It

相关标签:
1条回答
  • 2020-12-19 19:33

    Taking the same answer:

    After you implement the Self Validate Model, witch is a Server Side Validation, you need to create the Client Side Validation part, for that, just create this 3 steps:

    • Implement
    • Implement a jQuery validation method
    • Implement an unobtrusive adapter

    append to your IClientValidateble class

    public IEnumerable<ModelClientValidation> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        var rule = new ModelCLientValidationRule();
        rule.ErrorMessage = FormatErrorMessage(metadata.GetDisplayName());
        rule.ValidationType = "greater"; // This is what the jQuery.Validation expects
        rule.ValidationParameters.Add("other", OtherPropertyName); // This is the 2nd parameter
    
        yield return rule;
    }
    

    Then you need to write the new jQuery Validator and the metadata adapter that will link the jQuery.Validation with your code providing the correct data- attributes for that field (if of course, UnobtrusiveJavaScriptEnabled is true)

    create a new js file and attach to your <head> for example as

    <script src="@Url.Content("~/Scripts/customValidation.js")" type="text/javascript"></script>
    

    and append the new validation

    jQuery.validator.addMethod("greater", function(value, element, param) {
        // we need to take value and compare with the value in 2nd parameter that is hold in param
        return Date.parse(value) > Date.parse($(param).val());
    });
    

    and then we write the adapter

    jQuery.validator.unobtrusive.adapters.add("greater", ["other"], function(options) {
        // pass the 'other' property value to the jQuery Validator
        options.rules["greater"] = "#" + options.param.other;
        // when this rule fails, show message that comes from ErrorMessage
        options.messages["greater"] = options.message;
    });
    

    You can view this in the AccountModel.cs when you create a new MVC3 Web Applicatoin, it shows this method that implements the IClientValidatable

    [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
    public sealed class ValidatePasswordLengthAttribute : ValidationAttribute, IClientValidatable
    {
        private const string _defaultErrorMessage = "'{0}' must be at least {1} characters long.";
        private readonly int _minCharacters = Membership.Provider.MinRequiredPasswordLength;
    
        public ValidatePasswordLengthAttribute()
            : base(_defaultErrorMessage)
        {
        }
    
        public override string FormatErrorMessage(string name)
        {
            return String.Format(CultureInfo.CurrentCulture, ErrorMessageString,
                name, _minCharacters);
        }
    
        public override bool IsValid(object value)
        {
            string valueAsString = value as string;
            return (valueAsString != null && valueAsString.Length >= _minCharacters);
        }
    
        public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
        {
            return new[]{
                new ModelClientValidationStringLengthRule(FormatErrorMessage(metadata.GetDisplayName()), _minCharacters, int.MaxValue)
            };
        }
    }
    #endregion
    
    0 讨论(0)
提交回复
热议问题