9

次のaspがあります。

<asp:ValidationSummary ID="RegisterUserValidationSummary" runat="server" CssClass="failureNotification" 
        ValidationGroup="RegisterUserValidationGroup"/>

...

<asp:Label ID="UserNameLabel" runat="server" AssociatedControlID="UserNameTB">Username:</asp:Label>
<asp:TextBox ID="UserNameTB" runat="server" CssClass="textEntry"></asp:TextBox>
<asp:RegularExpressionValidator ID="RegularExpressionValidator1" ControlToValidate="UserNameTB" 
      ValidationExpression="[a-zA-Z]{3,8}" ErrorMessage="Username must be between 3 to 8 chars" runat="server"
      CssClass="failureNotification" ToolTip="Username must be between 3 to 8 chars" ValidationGroup="RegisterUserValidationGroup">
    *</asp:RegularExpressionValidator>
<asp:CustomValidator ID="NoUserValidator" ControlToValidate="UsernameTB" runat="server" ErrorMessage="User Taken!" CssClass="failureNotification" 
      ValidationGroup="RegisterUserValidationGroup"  OnServerValidate="UserValidate">*</asp:CustomValidator>

そして、関数:

protected void UserValidate(object source, ServerValidateEventArgs args)
    {
        SqlDataSource1.SelectCommand = "SELECT ClientID FROM [Clients] WHERE Username= '" + UserNameTB.Text + "'";
        DataView dv = (DataView)SqlDataSource1.Select(DataSourceSelectArguments.Empty);
        if (dv.Table.Rows.Count != 0)
            args.IsValid = false;
        else
            args.IsValid = true;
    }

ボタン:

<asp:Button ID="CreateUserButton" runat="server" CommandName="MoveNext" Text="Create User" 
       ValidationGroup="RegisterUserValidationGroup" 
       onclick="CreateUserButton_Click"/>

問題は、カスタム バリデータ関数が呼び出され.IsValidて false に設定されても、ボタン ロジックがまだ実行されていることです。

4

1 に答える 1

11

ボタンの onclick 関数で、ページが有効かどうかを確認するチェックを追加します。

protected void CreateUserButton_Click(object sender, EventArgs e)
{
    if (Page.IsValid)
    { 
        // Create the user
    }
}

それはそれを行う必要があります。これは、カスタム バリデータが、ポストバック中にサーバー上で検証するように設定されているためです。何が起こるかというと、コードは最初にバリデータ コードを実行しUserValidate、そこでIsValidフラグを設定します。ポストバック スタックの次は、ボタンの onclick 関数です。この関数はバリデータ関数の結果に関係なく実行されるため、ここでIsValidフラグの値を確認する必要があります。これは、サーバー側でカスタム検証コントロールを検証するときの動作です。

別の方法は、クライアント側で検証することです。ブラウザで生成されたページのソース コードを見ると、RegularExpressionValidator. その動作は既知であり、クライアント側で処理されるため、式を評価してページを検証するためにポストバックは必要ありません (すべて JavaScript によって処理されます)。カスタム バリデータ関数は不明であるため、クライアント側の検証スクリプトを自分で定義しない限り、ポストバックが必要です。

MSDNの詳細情報へのリンクは次のとおりです。

于 2012-06-16T15:34:46.390 に答える