我在点击按钮时以编程方式向页面添加自定义验证器,然后验证页面并检查页面的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>
答案 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)