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
}

しかしもちろん、ここではバリデーターはnullです(必要でない場合もあるので追加しないでください)...しかし、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 に答える