具有内置Validator的自定义TextBox:服务器端验证未触发

时间:2008-11-19 15:27:36

标签: asp.net validation custom-server-controls

我有一个看起来像这样的课程:

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);
   }
}

这已经在内部应用程序中工作了一段时间,其中始终启用了javascript。我最近注意到上游的javascript错误可以阻止验证器被触发,因此服务器端验证应该启动...对吗?正确?

因此Page.IsValid属性总是返回true(我甚至尝试在事先显式调用Page.Validate())。

经过一番挖掘,我发现验证器初始化方法应该将验证器添加到页面中,但由于我正在构建它的方式,我认为这不会发生。因此,客户端验证可行,但服务器端验证不起作用。

我试过这个:

protected override OnInit()
{
   base.OnInit();

   Page.Validators.Add(_validator); // <-- validator is null here
}

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

想法?

2 个答案:

答案 0 :(得分:1)

CreateChildControls基本上用于具有子项的控件。 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); 
        }
    }

这里是后面的ASP.NET页面:

 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" /> 

答案 1 :(得分:0)

验证者必须从BaseValidator继承。