私はあなたに少し謎を提示します...次のコントロールは、何があっても毎回検証に失敗することを目的としていますが、そうではありません:
public class Test : CompositeControl
{
protected override void CreateChildControls()
{
Controls.Clear();
CreateControlHierachy();
ClearChildViewState();
}
void CreateControlHierachy()
{
var validator = new CustomValidator
{
ErrorMessage = "Can't do that!"
};
validator.ServerValidate += (sender, e) =>
{
e.IsValid = false;
};
Controls.Add(validator);
}
}
この問題を「修正」するには、CreateControlHierachyに次の行を追加すると、すべてが期待どおりに機能します。
Controls.Add(new TextBox());
コントロールはweb.configに登録され、次のような単純なページに配置されます。
<uc:Test runat="server" />
ポストバックイベントでデバッガーを使用すると、次のことがわかります。
- 予想通り、バリデーターはページのコントロール階層にあります。
- バリデーターはPage.Validatorsに登録されていません。
- Page.IsValidとvalidator.IsValidはどちらも引き続きtrueです。
TextBoxはバリデーターにどのような影響を及ぼしますか?これを修正する正しい方法は何ですか?