Page.IsValid始终使用ValidationGroup和动态CustomValidator返回true

时间:2010-09-20 17:33:59

标签: asp.net validation

我在点击按钮时以编程方式向页面添加自定义验证器,然后验证页面并检查页面的IsValid属性。但IsValid属性始终返回true。请帮忙。这是代码。我需要动态添加自定义验证器以显示来自业务对象的验证消息。我将自定义验证程序的IsValid属性设置为false,因此我希望Page的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>

5 个答案:

答案 0 :(得分:3)

我对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";
        }

答案 1 :(得分:0)

BaseValidator.Validate Method

  

使用Validate方法执行   验证相关输入   控制。这个方法可以让你   以编程方式执行验证   输入控件。 IsValid   属性自动更新   验证结果。

当您致电validator.IsValid时,Page.Validate("vgCustom")正在重置为其默认值(True)。而对于ServerValidateEventHandler,您的代码是在Page.Validate("vgCustom") 而不是上设置IsValid,让它重置为默认值。如果您在调用validator.IsValid = false之后移动Page.Validate("vgCustom"),该页面将无法按预期验证。

我更喜欢使用以下模式:

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

首先,我认为在aspx中添加验证器更容易,而不是代码隐藏。一开始它会被隐藏起来。

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

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