私は次のようなクラスを持っています:
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からロードされていません)例えば)。
アイデア?