37

私は次のコードを持っていますRequiredFieldValidator。プロパティは、EnableClientScript検証コントロールで「false」として設定されます。また、ブラウザでスクリプトを無効にしました。

Page.IsValidコードビハインドでは使用していません。それでも、テキストボックスに値を入力せずに送信すると、error message.

Page_Load@Dai のコメントから、 で実行されるコードがある場合、これが問題になる可能性があることがわかりましたpostback。検証エラーはスローされません。

(ただし、ボタンクリックハンドラの場合はチェック不要Page.IsValid)

if (Page.IsPostBack)
{
    string value = txtEmpName.Text;
    txtEmpName.Text = value + "Appended";
}

質問

  1. サーバー側の検証が前に行われないのはなぜPage_Loadですか?
  2. を使用すると正常に動作するのはなぜPage.IsValidですか?
  3. これを説明する記事への参照を提供できますか? (言うものではありません-常に使用しPage.IsValidます;しかし、使用する必須のシナリオは何かを言うものPage.IsValid

更新 1

ASP.NET Validatorsを参照する よくある誤解

Page.IsValidPage.Validate()の後のどこかで暗黙的に呼び出されるメソッドを実行した後にのみアクセスできますPage_Load。すべてのロジックを Page_Load イベント ハンドラに保持する場合 (これは非常にお勧めできません)、 をPage.Validate()チェックする前に を呼び出しますPage.IsValid

:すべてのロジックを .xml に保持しないことをお勧めしPage_Loadます。ボタン クリック イベントで何かが発生する場合は、ボタン クリック イベント ハンドラーに移動します。ドロップダウン イベントで何かが発生する場合は、ドロップダウンの選択項目変更イベント ハンドラーに移動します。

更新 2

サーバー側の検証を使用している場合も追加する必要があるようIf(Page.IsValid)です。CustomValidator がうまく機能しないを参照してください。button clickCustom Validator

: クライアント側の検証に関する質問がここにあります: Page_IsValid または Page_ClientValidate() を使用するかどうか (クライアント側イベントの場合)

マークアップ

<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 がうまく機能しない
4

2 に答える 2

37

検証は の後Page_Load、イベント ハンドラーの前に行われます ( http://msdn.microsoft.com/en-us/library/ms178472(v=VS.100).aspxを参照)。

ボタンが検証を引き起こさない場合は、手動で起動する必要がありますPage.Validate.

Page.IsValid(1) 呼び出した後、Page.Validateまたは (2) 検証を引き起こすコントロールがポストバックのソースである/ポストバックに含まれるまで、質問することはできません。

イベント ハンドラーが起動する前に検証を行う必要がある場合は、次を使用できます。

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;
}

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

于 2012-12-07T13:06:57.477 に答える