web-dev-qa-db-ja.com

Page.IsValidはどのように機能しますか?

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 [〜#〜]

  1. Page_Loadの前にサーバー側の検証が行われないのはなぜですか?
  2. Page.IsValidを使用するとうまく動作するのはなぜですか?
  3. これを説明する記事への参照を提供できますか? (言うことではありません-常に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 ValidatorIf(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);
}

参照

  1. Page.IsValidを常に呼び出す必要がありますか?
  2. ASP.NET検証コントロール-重要なポイント、ヒント、コツ
  3. CustomValidatorがうまく機能しない
35
Lijo

検証は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;
}

これは、もちろん、アーキテクチャと、同じページライフサイクルの後続の検証中に初期検証中に合格/失敗した検証が合格/失敗すると仮定できるかどうかに完全に依存します。

35
Jaime Torres

[送信]ボタンには、検証コントロールと同じ検証グループが必要です。例えば

 <asp:Button Text=" Submit " runat="server" ID="btnSubmit" OnClick="btnSubmit_Click" ValidationGroup="vgCustomerValidation" />
0