代码之家  ›  专栏  ›  技术社区  ›  Ben Scheirman

带有内置验证程序的自定义文本框:服务器端验证未启动

  •  0
  • Ben Scheirman  · 技术社区  · 17 年前

    public class TextField : TextBox
    {
       public bool Required { get; set; }
       RequiredFieldValidator _validator;
    
       protected override void CreateChildControls()
       {
          base.CreateChildControls();
    
    
          _validator = new RequiredFieldValidator();
          _validator.ControlToValidate = this.ID;
          if(Required)
              Controls.Add(_validator);
       }
    
       public override void Render(HtmlTextWriter tw)
       {
          base.Render(tw);
    
          if(Required)
             _validator.RenderControl(tw);
       }
    }
    

    我试过这个:

    protected override OnInit()
    {
       base.OnInit();
    
       Page.Validators.Add(_validator); // <-- validator is null here
    }
    

    当然,这里的验证器是空的(有时它不是必需的,所以不应该添加它)。。。但是OnInit()对我来说做出这些决定还为时过早(例如,所需的属性不会从ViewState加载)。

    思想?

    2 回复  |  直到 17 年前
        1
  •  1
  •   azamsharp    17 年前

    CreateChildControls基本上用于具有child的控件。RequiredFieldValidator就像TextBox的兄弟。

    以下是适用于我的代码:

    public class RequiredTextBox : TextBox
        {
            private RequiredFieldValidator _req;
            private string _errorMessage;
    
            public string ErrorMessage
            {
                get { return _errorMessage; }
                set { _errorMessage = value; } 
            }
    
            protected override void OnInit(EventArgs e)
            {
                _req = new RequiredFieldValidator();
                _req.ControlToValidate = this.ID;
                _req.ErrorMessage = _errorMessage;
                Controls.Add(_req);
                base.OnInit(e); 
            }       
    
            protected override void Render(System.Web.UI.HtmlTextWriter writer)
            {
                base.Render(writer);
                _req.RenderControl(writer); 
            }
        }
    

     protected void SubmitClick(object sender, EventArgs e)
            {
                if(Page.IsValid)
                {
                    // do something
                }
            }
    

    以下是ASPX代码:

     <MyControl:RequiredTextBox runat="server" ErrorMessage="Name is required!" ID="txtName"></MyControl:RequiredTextBox>
    
        <asp:Button ID="Btn_Submit" runat="server" Text="Submit" OnClick="SubmitClick" /> 
    
        2
  •  0
  •   kÍ©eÍ£mÍ®pÍ¥ Í©    17 年前

    验证器必须从BaseValidator继承。