0

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

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() )。

经过一番挖掘,我发现验证器 init 方法应该将验证器添加到页面中,但由于我构建它的方式,我认为这不会发生。因此,客户端验证有效,但服务器端验证无效。

我试过这个:

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

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

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

想法?

4

2 回答 2

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" /> 
于 2008-11-19T16:23:42.690 回答
0

验证器必须从 BaseValidator 继承。

于 2008-11-19T15:33:03.727 回答