复合控制中的自定义验证器未启动



我严重陷入了这个问题的中间。谷歌搜索了很多,但没有找到解决方案。

我的目标是使用标签,文本框,两个必需的字段验证器和自定义验证器创建一个复合控件。我的自定义控制代码如下: -

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace AFGISServerControl
{
    [ToolboxData("<{0}:ValidatorTextBox runat="""server"> </{0}:ValidatorTextBox>")]
    public class ValidatorTextBox : CompositeControl
    {
        private TextBox InputTextBox;
        private Label InputLabel;
        private RequiredFieldValidator RequiredValidator1;
        private RequiredFieldValidator RequiredValidator2;
        private CustomValidator cv;
        private static readonly object EventValidateKey = new object();
        protected override void OnLoad(EventArgs e)
        {
            EnsureChildControls();
            base.OnLoad(e);
        }
        protected override void CreateChildControls()
        {
            Controls.Clear();
            InputTextBox = new TextBox();
            InputLabel = new Label();
            InputTextBox.ID = "inputTextBox";
            //InputTextBox.AutoPostBack = true;
            RequiredValidator1 = new RequiredFieldValidator();
            RequiredValidator1.ID = this.ID + "_RFV1";
            RequiredValidator1.ControlToValidate = InputTextBox.ID;
            RequiredValidator1.ValidationGroup = string.Empty;
            RequiredValidator1.Display = ValidatorDisplay.Dynamic;
            RequiredValidator1.ErrorMessage = Caption.ToString() + " is mandatory";
            RequiredValidator2 = new RequiredFieldValidator();
            RequiredValidator2.ID = this.ID + "_RFV2";
            RequiredValidator2.ControlToValidate = InputTextBox.ID;
            RequiredValidator2.Display = ValidatorDisplay.Dynamic;
            RequiredValidator2.ErrorMessage = Caption.ToString() + " is mandatory";
            cv = new CustomValidator();
            cv.ID = this.ID + "_CV";
            cv.ControlToValidate = InputTextBox.ID;
            cv.SetFocusOnError = true;
            cv.Display = ValidatorDisplay.Dynamic;
            cv.ErrorMessage = this.CustomErrorMessage;
            cv.ValidateEmptyText = true;
            cv.ServerValidate += new System.Web.UI.WebControls.ServerValidateEventHandler(this.cv_ServerValidate);
            this.Controls.Add(InputLabel);
            this.Controls.Add(InputTextBox);
            this.Controls.Add(RequiredValidator1);
            this.Controls.Add(RequiredValidator2);
            this.Controls.Add(cv);
        }
        #region properties
        [
        Bindable(true),
        Category("Default"),
        DefaultValue(""),
        Description("Value")
        ]
        public string Text
        {
            get
            {
                EnsureChildControls();
                return InputTextBox.Text;
            }
            set
            {
                EnsureChildControls();
                InputTextBox.Text = value;
            }
        }
        [
        Bindable(true),
        Category("Default"),
        DefaultValue(""),
        Description("Validation Group")
        ]
        public string ValidationGroup
        {
            get
            {
                EnsureChildControls();
                return InputTextBox.ValidationGroup;
            }
            set
            {
                EnsureChildControls();
                InputTextBox.ValidationGroup = value;
                RequiredValidator2.ValidationGroup = value;
                cv.ValidationGroup = value;
            }
        }
        [
        Bindable(true),
        Category("Default"),
        DefaultValue(""),
        Description("Error message for the custom validator.")
        ]
        public string CustomErrorMessage
        {
            get
            {
                EnsureChildControls();
                return cv.ErrorMessage;
            }
            set
            {
                EnsureChildControls();
                cv.ErrorMessage = value;
            }
        }
        [
        Bindable(true),
        Category("Default"),
        DefaultValue(""),
        Description("Validity of custom validator.")
        ]
        public Boolean isValid
        {
            get
            {
                EnsureChildControls();
                return cv.IsValid;
            }
            set
            {
                EnsureChildControls();
                cv.IsValid = value;
            }
        }
        [
        Bindable(true),
        Category("Default"),
        DefaultValue(""),
        Description("The text for the name label.")
        ]
        public string Caption
        {
            get
            {
                EnsureChildControls();
                return InputLabel.Text;
            }
            set
            {
                EnsureChildControls();
                InputLabel.Text = value;
            }
        }
        #endregion
        protected override void RecreateChildControls()
        {
            EnsureChildControls();
        }
        [
        Category("Action"),
        Description("Raised on Text Change")
        ]
        public event ServerValidateEventHandler Validate
        {
            add
            {
                Events.AddHandler(EventValidateKey, value);
            }
            remove
            {
                Events.RemoveHandler(EventValidateKey, value);
            }
        }
        protected virtual void OnValidate(ServerValidateEventArgs args)
        {
            EventHandler ValidateHandler = (EventHandler)Events[EventValidateKey];
            if (ValidateHandler != null)
            {
                ValidateHandler(this, args);
            }
        }
        protected void cv_ServerValidate(object source, ServerValidateEventArgs args)
        {
            OnValidate(args);
        }
        protected override void Render(HtmlTextWriter writer)
        {
            AddAttributesToRender(writer);
            InputLabel.RenderControl(writer);
            InputTextBox.RenderControl(writer);
            RequiredValidator1.RenderControl(writer);
            RequiredValidator2.RenderControl(writer);
            cv.RenderControl(writer);
        }        
    }
}

我的aspx代码是

    <cc1:ValidatorTextBox ID="ValidatorTextBox1" runat="server" Caption="Service No"
        CustomErrorMessage="Not Valid" ValidationGroup="test" 
        OnValidate="CVText" />
    <asp:Button ID="Button1" runat="server" Text="Button" />

aspx.cs

面临的特定问题是

  • " onvalidate"事件的方法背后的代码未被解雇
  • 必需的字段验证器错误消息仅显示"是强制性的",标题没有前缀。

我会为建议而巨大。

几件事:

  • 您需要调用page.validate()或在源控件上发射带有casusesvalidation = true的后备。确保您在执行验证时未指定验证程序或使用"测试"验证程序。
  • 在CreateChildControls期间正在设置所需的现场验证器。您的标题是从输入文本中提取的,直到帖子发帖才填写。在加载ViewState之前,您的CreateChildControls可能发生。您可能需要使用JavaScript设置必需的FieldValidator文本,或者在文本更改时使用_textchanged事件处理程序更新错误消息。您采用的方法显然取决于您的特定用例。

断头后,我改变了使用此控件的整个过程。继续使用Ivalidator的使用情况。那是一种有效的方法。

最新更新