19

私は以前にこの問題に遭遇しましたが、完全に解決したことはありません。いくつかのバリデーターと CustomValidator を含むフォームがあります。

<asp:Label ID="lblMemberNum" runat="server" Text="Membership #:" CssClass="LabelMedium"  ></asp:Label>
<asp:TextBox ID="txtMemberNum" runat="server" CssClass="TextBox" ></asp:TextBox>
<asp:RequiredFieldValidator ID="rfvMemberNum" SetFocusOnError="True" runat="server"
    ControlToValidate="txtMemberNum" ErrorMessage="[ Membership # ] is required"
    CssClass="ValidationMessage" Display="Dynamic" >*</asp:RequiredFieldValidator>
<asp:RegularExpressionValidator ID="revMemberNum"  Display="Dynamic" runat="server" 
    ControlToValidate="txtMemberNum" CssClass="ValidationMessage" 
    ErrorMessage="[ Membership # ] can only contain letters" 
    ValidationExpression="^([a-zA-Z\d]+)$" >*</asp:RegularExpressionValidator>
<asp:CustomValidator ID="cvMemberNum" runat="server" 
    CssClass="ValidationMessage" Display="Dynamic"
    ControlToValidate="txtMemberNum" ValidateEmptyText="false"
    OnServerValidate="cvMemberNum_Validate" 
    ErrorMessage="This membership number is already registered">*</asp:CustomValidator>

<asp:ValidationSummary ID="ValidationSummary1" runat="server" 
    CssClass="ValidationMessage" 
    ShowMessageBox="True" ShowSummary="False" />

サーバー側では:

protected void cvMemberNum_Validate(object source, ServerValidateEventArgs args)
{
    try
    {
        args.IsValid  = (!CampaignRegistration.IsMemberRegistered(args.Value));
    }
    catch
    {
        args.IsValid = false;
    }
}

私の問題は、ValidationSummary に CustomValidator からのメッセージが表示されないことです。この質問はいくつかの場所で尋ねられましたが、満足のいく答えを見たことがありません。

4

7 に答える 7

10

すべてのバリデーターとValidationSummaryでValidationGroupプロパティを使用してみてください。

編集:別の可能性はサーバー検証コードである可能性があります

args.IsValid = (!CampaignRegistration.IsMemberRegistered(args.Value));

がfalseを返す場合CampaignRegistration.IsMemberRegistered(args.Value)、「!」それを真実にし、したがってそれを有効にしている。「!」を消すべきだと思います 次のように:

args.IsValid = CampaignRegistration.IsMemberRegistered(args.Value);

更新: ValidationSummaryでカスタムバリデーターメッセージをメッセージボックスに表示するには、 ClientValidationFunctionコードが必要です。ポップアップなしで要約のみを表示する必要がある場合、これは必要ありません。

<asp:CustomValidator ID="cvMemberNum" runat="server" 
    CssClass="ValidationMessage" Display="Dynamic"
    ControlToValidate="txtMemberNum" ValidateEmptyText="false"
    OnServerValidate="cvMemberNum_Validate"
    ClientValidationFunction = "ClientValidate"  
    ErrorMessage="This membership number is already registered">*</asp:CustomValidator>
   //JavaScript Code.
   function ClientValidate(source, args)
   {         
      args.IsValid = false; //you need to add validation logic here
   }

詳細: ClientSide検証を実行したくない場合は、このトリックを試してアラートを表示してください。CustomValidatorServerValidateメソッドに次の変更を加えます。

protected void cvMemberNum_Validate(object source, ServerValidateEventArgs args)
{
    bool isValid = true;
    try
    {
        isValid  = (!CampaignRegistration.IsMemberRegistered(args.Value));
    }
    catch
    {
        isValid = false;
    }
    args.IsValid = isValid;

    if(!isValid)
    {
       if(!Page.IsClientScriptBlockRegistered("CustomValidation")) 
         Page.RegisterClientScriptBlock("CustomValidation", "<script>alert('This membership number is already registered');</script>"); 

    }

}
于 2009-05-01T15:00:04.100 に答える
7

ShowMessageBoxオプションは完全にクライアント側であるため、CustomValidator に ClientValidationFunction設定した場合にのみ評価されます

また、アラートを作成するスクリプトを登録することで偽装することもできます。そのため、サーバーの検証から戻ったときに、エラー メッセージが表示されます。これは ServerValidate メソッド ( @Jose Basilioごと) に登録するか、 PreRender イベント中に次のメソッドを呼び出して、ページ上のすべての無効なバリデーターを含むポップアップを登録できます。

    /// <summary>
    /// Registers a script to display error messages from server-side validation as the specified <see cref="UserControl"/> or <see cref="Page"/> loads from a postback.
    /// </summary>
    /// <remarks>
    /// Must be called in the PreRender if used to validate against the Text property of DNNTextEditor controls, otherwise Text will not be populated.
    /// Must set the ErrorMessage manually if using a resourcekey, otherwise the resourcekey will not have overridden the ErrorMessage property.
    /// </remarks>
    /// <param name="ctrl">The <see cref="UserControl"/> or <see cref="Page"/> which is being posted back.</param>
    /// <param name="validationGroup">The validation group against which to validate.</param>
    public static void RegisterServerValidationMessageScript(TemplateControl ctrl, string validationGroup)
    {
        if (ctrl != null && ctrl.Page.IsPostBack)
        {
            ctrl.Page.Validate(validationGroup);
            if (!ctrl.Page.IsValid)
            {
                StringBuilder errorMessage = new StringBuilder("<script language='javascript'>alert('");
                for (int i = 0; i < ctrl.Page.Validators.Count; i++)
                {
                    IValidator validator = ctrl.Page.Validators[i];
                    if (!validator.IsValid)
                    {
                        errorMessage.Append("- " + validator.ErrorMessage);
                        if (i < ctrl.Page.Validators.Count - 1)
                        {
                            errorMessage.Append(@"\r\n");
                        }
                    }
                }

                errorMessage.Append("');</script>");
                ctrl.Page.ClientScript.RegisterStartupScript(typeof(IValidator), "validationAlert", errorMessage.ToString(), false);
            }
        }
    }
于 2009-05-01T16:24:29.950 に答える
5

私は最近同じ問題を抱えていました。ServerValidate が検証の失敗を示したときに、ValidationSummary が CustomValidator からの ErrorMessage を表示していませんでした。デフォルトでは (私の小さなリバース エンジニアリングが示したように) 検証サマリーはポストバック時にクライアント側でレンダリングされるため、ドキュメントの読み込み/非同期ポストバックの完了時にすべてのバリデーターをチェックし、失敗した検証グループの検証サマリーの作成をトリガーするスクリプトを追加しただけです。

$(document).ready(function () {
    var displayAlert = function () {
        if (typeof Page_Validators == 'undefined') return;

        var groups = [];
        for (i = 0; i < Page_Validators.length; i++)
            if (!Page_Validators[i].isvalid) {
                if (!groups[Page_Validators[i].validationGroup]) {
                    ValidationSummaryOnSubmit(Page_Validators[i].validationGroup);
                    groups[Page_Validators[i].validationGroup] = true;
                }
            }
    };

    displayAlert();

    Sys.WebForms.PageRequestManager.getInstance().add_endRequest(
                    function () {
                        displayAlert();
                    });
}
);

私のシナリオでは、親ページにバリデータ、更新パネル、および検証の概要を含むユーザー コントロールをネストしました。

詳細はこちら。

于 2010-09-06T14:32:18.890 に答える
1

bdukeのRegisterServerValidationMessageScriptは「偽物」ですが、そうではありません。それは本当に問題を修正します。すべてのユーティリティ名前空間には、この関数がどこかに必要です。

于 2011-04-11T16:08:05.370 に答える
1

JavaScript が無効になっており、に のプロパティがValidationSummary表示されない場合の回避策を見つけました。上記のように、スクリプトまたはアラートを挿入しても機能しないため、これが必要です。 errorMessageCustomValidator

新しい Validator コントロールを追加し、それを と呼びCustomValidatorProxy、そのControlToValidateプロパティをフォーム上のいずれかのコントロールに設定し、EnableClientScript=false.

イベント ハンドラー内でServerValidateカスタム検証を実行し、検証が失敗した場合は と のプロパティIsValidをfalse に設定し、同様に両方のプロパティを設定します。 CustomValidatorCustomValidatorProxyErrorMessage

の検証にServerValidate合格した場合は、 の IsValid プロパティがCustomValidatorProxytrue に設定されていることを確認してください。

がページののCustomValidatorProxy前にある場合、 ServerValidateハンドラーは、値を検証して が返すプロパティ値をオーバーライドし、あなたのが に表示されます。CustomValidatorValidatorCollectionIsValidCustomValidatorProxyControlToValidateErrorMessageCustomValidatorValidationSummary

于 2010-10-26T15:28:20.323 に答える
1

プロパティを書く必要があります

ValidationGroup="ValidationSummary1"

あなたの場合のすべてのバリデーターで。

また、ページに

AutoEventWireup="true"
于 2009-05-01T15:12:20.903 に答える
1

これは私のために働いた:

<asp:CustomValidator runat="server" ID="cv" 
ClientValidationFunction="ValidateFunction"
ErrorMessage="Default error
message">*</asp:CustomValidator>

<script type="text/javascript">
function ValidateFunction(sender, args) 
{

var msg ='';
var formValid = true;

[various checks setting msg and formValid]

if (msg.length > 0) { sender.errormessage = msg; }
args.IsValid = formValid;

}
</script>
于 2010-08-03T09:47:46.747 に答える