与内置验证器的自定义文本框:服务器侧验证未触发[英] Custom TextBox with built-in Validator: server side validation not firing

本文是小编为大家收集整理的关于与内置验证器的自定义文本框:服务器侧验证未触发的处理方法,想解了与内置验证器的自定义文本框:服务器侧验证未触发的问题怎么解决?与内置验证器的自定义文本框:服务器侧验证未触发问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我有一个看起来这样的类:

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错误可以阻止验证器从射击中,因此服务器侧验证应该启动......对吗?右?

所以页面.Isvalid属性始终返回true(我甚至尝试过明确调用page.validate()之前).

在一些挖掘之后,我发现验证器Init方法应该将验证器添加到页面,但由于我建立它的方式,我认为这不会发生这种情况.因此,客户端验证工作,但服务器侧验证没有.

我已经尝试过:

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

   Page.Validators.Add(_validator); // <-- validator is null here
}
但是当然,验证器在此处为空(有时它不需要,所以不应添加)......但是oninit()真的很早就为我制作这些决定(所需的财产不需要例如,从ViewState加载).

想法?

推荐答案

crectechildcontrols基本上用于具有姓氏的控件.必需的rieldValidator就像是一个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" /> 

其他推荐答案

验证器必须从basevalidator继承.

本文地址:https://www.itbaoku.cn/post/1793747.html