How to validate against Multiple validation groups?

后端 未结 4 1318
梦如初夏
梦如初夏 2021-01-04 20:03

I have two validation groups: parent and child

I have an add button that needs to only validate the child validation group which is easily done. The save button ne

4条回答
  •  被撕碎了的回忆
    2021-01-04 20:18

    Whatever way you do it requires some hacking to get round ASP.Net's assumption that you wouldn't try to do this. I favour a reusable approach which is explicit about the hackery involved.

    using System;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    namespace WebSandbox.Validators
    {
        /// 
        ///   
        ///     Validates a different validation group. Among the use cases envisioned are
        ///     
        ///       
        ///         Validating one set of rules when the user clicks "Save draft" and validating those rules plus some
        ///         extra consistency checks when they click "Send".
        ///       
        ///       
        ///         Grouping controls in a fieldset into a validation group with a
        ///         ValidationSummary and then having a final ValidationSummary which tells the
        ///         user which groups still have errors.
        ///       
        ///     
        ///   
        ///   
        ///     We include checks against setting GroupToValidate to the same value as
        ///     ValidationGroup, but we don't yet include checks for infinite recursion with one validator
        ///     in group A which validates group B and another in group B which validates group A. Caveat utilitor.
        ///   
        /// 
        public class ValidationGroupValidator : BaseValidator
        {
            public string GroupToValidate
            {
                get { return ViewState["G2V"] as string; }
                set { ViewState["G2V"] = value; }
            }
    
            protected override bool ControlPropertiesValid()
            {
                if (string.IsNullOrEmpty(GroupToValidate)) throw new HttpException("GroupToValidate not specified");
                if (GroupToValidate == ValidationGroup) throw new HttpException("Circular dependency");
                // Don't call the base, because we don't want a "control to validate"
                return true;
            }
    
            protected override void AddAttributesToRender(HtmlTextWriter writer)
            {
                base.AddAttributesToRender(writer);
    
                writer.AddAttribute("evaluationfunction", "ValidateValidationGroup");
                writer.AddAttribute("GroupToValidate", GroupToValidate);
            }
    
            protected override void OnPreRender(EventArgs e)
            {
                // The standard validation JavaScript is too restrictive for this validator to work, so we have to replace a key function.
                // Fortunately this runs later than the standard JS, so we can simply overwrite the existing value of Page_ClientValidate.
                Page.ClientScript.RegisterStartupScript(typeof(ValidationGroupValidator), "validationJS", _ValidationJS);
    
                base.OnPreRender(e);
            }
    
            protected override bool EvaluateIsValid()
            {
                if (string.IsNullOrEmpty(GroupToValidate)) return false;
    
                bool groupValid = true;
                foreach (IValidator validator in Page.GetValidators(GroupToValidate))
                {
                    validator.Validate();
                    groupValid &= validator.IsValid;
                }
    
                return groupValid;
            }
    
            private const string _ValidationJS = @"";
        }
    }
    

提交回复
热议问题