【问题标题】:Page.IsValid always returning true with ValidationGroup and dynamic CustomValidatorPage.IsValid 始终使用 ValidationGroup 和动态 CustomValidator 返回 true
【发布时间】:2010-09-20 17:33:59
【问题描述】:

我通过单击按钮以编程方式向页面添加自定义验证器,然后验证页面并检查页面的 IsValid 属性。但 IsValid 属性始终返回 true。请帮忙。这是代码。我需要动态添加自定义验证器以显示来自业务对象的验证消息。我将自定义验证器的 IsValid 属性设置为 false,因此我希望页面的 IsValid 属性在验证后也返回 false。无法理解我在这里做错了什么。

    protected void Button1_Click(object sender, EventArgs e)
{
    var validator = new CustomValidator();
    validator.IsValid = false;
    validator.ErrorMessage = "The input is invalid";
    validator.ValidationGroup = "vgCustom";
    Page.Validators.Add(validator);
    ValidationSummary1.ValidationGroup = "vgCustom";
    Page.Validate("vgCustom");
    Label1.Text = Page.IsValid ? "The Page is valid" : "The Page is Invalid";
}

这里是 HTML 标记

<html xmlns="http://www.w3.org/1999/xhtml" >
 <head runat="server">
    <title></title>
 </head>
 <body>
    <form id="form1" runat="server">
    <div>
        <asp:ValidationSummary ID="ValidationSummary1" runat="server"/>
        <asp:Button ID="Button1" runat="server" Text="Validate" OnClick="Button1_Click" />
        <asp:Label ID="Label1" runat="server"></asp:Label>
    </div>
    </form>
 </body>
</html>

【问题讨论】:

  • 如果我将自定义验证器添加到标记并在“ServerValidate”事件处理程序中返回 false 并以编程方式设置错误消息,则它可以工作。但我不明白有什么区别。

标签: asp.net validation


【解决方案1】:

我对RequiredFieldValidator 有同样的问题(Page.IsValid 总是正确的) 我有一个面板,我只想在验证为假时才显示:

<asp:Panel ID="PanelValidationMessage" CssClass="hide messegeFailed" runat="server">
   <p><asp:RequiredFieldValidator ID="RequiredFieldValidatorProductForTransfer" 
                                  runat="server"
                                  ValidationGroup="Transfer"
                                  ErrorMessage="Please Select Product for Transfer"
                                  ControlToValidate="DDLProductForTransfer"
                                  InitialValue="0"
                                  SetFocusOnError="true"
                                  Display="Dynamic"></asp:RequiredFieldValidator></p>

</asp:Panel>

在我将按钮的“CausesValidation”属性从“true”更改为“false”后,此问题已解决:

<asp:Button ID="BtnTransfer" 
            runat="server" 
            Text="Transfer Products" 
            onclick="BtnTransfer_Click" 
            ValidationGroup="Transfer"
            CausesValidation="false"/>

后面的代码:

Page.Validate("Transfer");
        if (Page.IsValid)
        {
            PanelValidationMessage.CssClass = "hide messegeFailed";
        }
        else
        {
            PanelValidationMessage.CssClass = "show messegeFailed";
        }

【讨论】:

    【解决方案2】:

    @James 不正确,您需要将 CausesValidation="true" 添加到您的按钮。

    【讨论】:

      【解决方案3】:

      BaseValidator.Validate Method:

      使用Validate方法来执行 验证相关输入 控制。该方法允许您 以编程方式执行验证 输入控件。 IsValid 属性会自动更新为 验证结果。

      因此,当您调用 Page.Validate("vgCustom") 时,validator.IsValid 将被重置为其默认值 (True)。而使用 ServerValidateEventHandler,您的代码将 IsValid 设置为 Page.Validate("vgCustom") 而不是 让它重置为默认值。如果您在调用Page.Validate("vgCustom") 之后将validator.IsValid = false 移动到,则页面应该无法按预期进行验证。

      我更喜欢使用以下模式:

      /// <summary>
      /// A validator that fails unconditionally. Useful if you need to do
      /// validation entirely in the code-behind, yet still integrate with
      /// the standard ASP.NET validation framework.
      /// </summary>
      public class FailValidator : BaseValidator {
          protected override bool ControlPropertiesValid() {
              // make setting ControlToValidate optional
              return true;
          }
      
          protected override bool EvaluateIsValid() {
              return false;
          }
      }
      

      【讨论】:

        【解决方案4】:

        您需要将验证组添加到按钮以触发它

        【讨论】:

          【解决方案5】:

          首先,我认为在您的 aspx 中添加验证器比在代码隐藏中添加更容易。一开始它还是会被隐藏的。

          其次,在您的 aspx.xml 中设置 OnServerValidate="myControl_OnServerValidate" 属性。 然后,在您的代码隐藏中实现 myControl_OnServerValidate():您的验证代码可以将 validator.IsValid 设置为 false。当 Page 验证时,它会自动聚合来自您的验证器的值,并且 Page.IsValid 将由 Page 实现设置为 false

          注意,客户端验证运行,如果客户端一切顺利,则服务器验证运行(请参阅https://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.customvalidator.aspx#Remarks

          【讨论】:

            猜你喜欢
            • 2010-12-23
            • 2011-05-09
            • 1970-01-01
            • 1970-01-01
            • 2023-03-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多