代码之家  ›  专栏  ›  技术社区  ›  Alfero Chingono

使CustomValidator与ValidationSummary消息框一起工作的优雅方式

  •  19
  • Alfero Chingono  · 技术社区  · 16 年前

    我以前遇到过这个问题,但从来没有完全解决过。我有一个带有几个验证器的表单,还有一个自定义验证器。

    <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的消息。这个问题有好几个地方问过,但我没有看到满意的答案。

    7 回复  |  直到 12 年前
        1
  •  10
  •   Jose Basilio    16 年前

    尝试在所有验证器和validationSummary中使用validationGroup属性。

    编辑: 另一种可能是服务器验证代码

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

    如果 CampaignRegistration.IsMemberRegistered(args.Value) 正在返回false,“!”使其成为真实的,因此使其成为有效的。我觉得你应该去掉“!”如下:

    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
       }
    

    更多: 如果不想进行客户端验证,请尝试此技巧以显示警报。对CustomValidator ServerValidate方法进行此更改:

    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>"); 
    
        }
    
    }
    
        2
  •  7
  •   Community CDub    8 年前

    这个 ShowMessageBox 选项是完全客户端的,因此只有在设置了 ClientValidationFunction CustomValidator .

    您还可以通过注册一个发出警报的脚本来伪造它,因此当您从服务器的验证返回时,它将提示错误消息。这可以在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);
                }
            }
        }
    
        3
  •  5
  •   Maxim Saplin    14 年前

    我最近也有同样的问题。当ServerValidate声明的验证失败时,ValidationSummary未显示来自CustomValidator的错误消息。由于默认情况下(如我的反向工程所示),验证摘要在回发时呈现在客户端,因此我只添加了一个脚本,用于检查文档加载/异步回发完成时的所有验证程序,并触发失败验证组的验证摘要创建:

    $(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();
                        });
    }
    );
    

    在我的场景中,我在父页面上嵌套了带有验证器、更新面板和验证摘要的用户控件。

    More details here.

        4
  •  1
  •   Iralda Mitro    16 年前

    你应该写一个属性

    ValidationGroup="ValidationSummary1"

    在您的案例中的每个验证器上。

    还要检查您的页面是否有

    AutoEventWireup="true"
    
        5
  •  1
  •   Morten71    14 年前

    这对我很有用:

    <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>
    
        6
  •  1
  •   Super Dave    14 年前

    bduke的registerservevalidationmessagescript是“伪造的”,但事实并非如此。它确实解决了问题。每个实用工具名称空间都需要这个函数。

        7
  •  1
  •   James A Mohler Nika    12 年前

    我发现了一个解决方法,当禁用javascript时, ValidationSummary 不显示 errorMessage 性质 CustomValidator . 这是必需的,因为注入脚本或警报(如上所述)将不起作用。

    添加一个新的验证器控件,我们称之为 CustomValidatorProxy 设置它的 ControlToValidate 属性设置为窗体上的任何一个控件,并且 EnableClientScript=false .

    ServerValidate 事件处理程序执行自定义验证,如果验证失败,请设置 IsValid 性质 控件 自定义验证代理 设置为“假”,并以类似方式设置两者 ErrorMessage 性质。

    如果验证在 服务器验证 是通过的。请确保

    ValidatorCollection

    推荐文章