RequiredFieldValidator
を使用した次のコードがあります。 EnableClientScript
プロパティは、検証コントロールで「false」に設定されています。また、ブラウザでスクリプトを無効にしました。
コードビハインドでPage.IsValid
を使用していません。それでも、テキストボックスに値を指定せずに送信すると、error message
が返されます。
@Daiのコメントから、postback
で実行されるPage_Load
にコードがある場合、これが問題になる可能性があることがわかりました。検証エラーはスローされません。
(ただし、ボタンクリックハンドラーの場合、Page.IsValid
を確認する必要はありません)
if (Page.IsPostBack)
{
string value = txtEmpName.Text;
txtEmpName.Text = value + "Appended";
}
[〜#〜] question [〜#〜]
Page_Load
の前にサーバー側の検証が行われないのはなぜですか?Page.IsValid
を使用するとうまく動作するのはなぜですか?Page.IsValid
を使用しますが、Page.IsValid
を使用するために必須のシナリオは何かを言うものです更新1
ASP.NET Validatorsの一般的な誤解 を参照してください
Page.IsValid
は、Page_Load
の後に暗黙的に呼び出されるPage.Validate()
メソッドを実行した後にのみアクセスできます。すべてのロジックをPage_Loadイベントハンドラーに保持する場合(非常に非推奨です!)、Page.IsValid
をチェックする前にPage.Validate()
を呼び出します。
注:推奨されます保持しないPage_Load
のすべてのロジック。ボタンクリックイベントで何かが発生する場合は、ボタンクリックイベントハンドラーに移動します。ドロップダウンイベントで何かが発生する場合は、選択したアイテムのドロップダウンイベント変更ハンドラーに移動します。
更新2
サーバー側検証でbutton click
を使用している場合も、Custom Validator
にIf(Page.IsValid)
を追加する必要があるようです。 CustomValidatorがうまく機能しない を参照してください。
注:ここにクライアント側の検証質問があります: Page_IsValidまたはPage_ClientValidate()(クライアント側イベント用)を使用するかどうか
[〜#〜] markup [〜#〜]
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<script type="text/javascript">
alert('haiii');
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:ValidationSummary runat="server" ID="vsumAll" DisplayMode="BulletList" CssClass="validationsummary" ValidationGroup="ButtonClick" />
<asp:TextBox ID="txtEmpName" runat="server"></asp:TextBox>
<asp:RequiredFieldValidator ID="valEmpName" runat="server" ControlToValidate="txtEmpName"
EnableClientScript="false" ErrorMessage="RequiredFieldValidator" Text="*" Display="Dynamic"
ValidationGroup="ButtonClick"></asp:RequiredFieldValidator>
<asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Button" ValidationGroup="ButtonClick" />
</div>
</form>
</body>
</html>
コードビハインド
protected void Button1_Click(object sender, EventArgs e)
{
string value = txtEmpName.Text;
SubmitEmployee(value);
}
参照:
検証はPage_Load
の後、イベントハンドラの前に行われます( http://msdn.Microsoft.com/en-us/library/ms178472(v = VS.100).aspx を参照)。
ボタンが検証を引き起こさない場合は、Page.Validate.
を手動で起動する必要があります
(1)Page.IsValid
を呼び出した後、または(2)検証を引き起こすコントロールがポストバックのソースである/含まれるまで、Page.Validate
に問い合わせることはできません。
イベントハンドラーが起動する前に検証を行う必要がある場合は、次を使用できます。
if (Page.IsPostback)
{
Page.Validate( /*Control Validation Group Name Optional*/ );
if (Page.IsValid)
{
//Do some cool stuff
}
}
また、再設計する必要がないように、再設計を検討することもできます。
検証を引き起こすコントロールを処理するイベントハンドラーでは、Page.IsValid
が利用可能であることが保証されています。他のすべての場合、検証を再要求する方が一般に安全です。バリデーターを持つフォームでの送信を処理するための1つのモデル:
void btnSubmit_Click(object sender, EventArgs e)
{
this.UpdateGUIWithSubmitRequest();
if (Page.IsValid)
{
this.ProcessSuccessfulSubmission();
}
else
{
this.ProcessInvalidSubmission();
}
}
非常にコストのかかる検証ステップを持つCustomValidator
を使用している場合は、結果をHttpResponse.Cache
にキャッシュすることを検討してください。Page.Validateが複数回呼び出された場合に再検証する必要はありません。
void CustomValidator_ServerValidate(object source, ServerValidateEventArgs args)
{
CustomValidator self = (CustomValidator)source;
string validatorResultKey = self.ClientID;
bool? validatorResult = Context.Items[validatorResultKey] as bool?;
if (validatorResult.HasValue)
{
args.IsValid = validatorResult.Value;
return;
}
bool isValid = this.DoSomethingVeryTimeConsumingOrExpensive();
Context.Items[validatorResultKey] = isValid;
args.IsValid = isValid;
}
これは、もちろん、アーキテクチャと、同じページライフサイクルの後続の検証中に初期検証中に合格/失敗した検証が合格/失敗すると仮定できるかどうかに完全に依存します。
[送信]ボタンには、検証コントロールと同じ検証グループが必要です。例えば
<asp:Button Text=" Submit " runat="server" ID="btnSubmit" OnClick="btnSubmit_Click" ValidationGroup="vgCustomerValidation" />