我有以下代码RequiredFieldValidator
。验证控件中的EnableClientScript
属性设置为“false”。我也在浏览器中禁用了脚本。
我没有在后面的代码中使用Page.IsValid
。不过,当我在文本框中提交没有任何价值时,我会得到error message
。
根据@Dai的评论,如果Page_Load
中有postback
中的任何代码在Page.IsValid
中执行,我就会发现这可能是一个问题。不会抛出任何验证错误。
(但是,对于按钮点击处理程序,无需检查if (Page.IsPostBack)
{
string value = txtEmpName.Text;
txtEmpName.Text = value + "Appended";
}
)
Page_Load
问题
Page.IsValid
之前发生?Page.IsValid
时,为什么它可以正常工作?Page.IsValid
;但是说明了使用Page.IsValid
更新1
参考ASP.NET Validators Common Misconception
Page.Validate()
只有在Page_Load
之后隐式调用的Page.Validate()
方法运行后才能访问。如果您将所有逻辑保存在Page_Load事件处理程序中(非常不鼓励!),请在检查Page.IsValid
之前调用Page_Load
。
注意:建议不要保留 If(Page.IsValid)
中的所有逻辑。如果按钮单击事件发生了某些事情,请将其移动到按钮单击事件处理程序。如果在下拉事件中发生某些事情,请将其移至下拉列表中选择的项目更改事件处理程序。
更新2
似乎,如果我们使用button click
进行服务器端验证,我们还需要在Custom Validator
中添加<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<script type="text/javascript">
alert('haiii');
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:ValidationSummary runat="server" ID="vsumAll" DisplayMode="BulletList" CssClass="validationsummary" ValidationGroup="ButtonClick" />
<asp:TextBox ID="txtEmpName" runat="server"></asp:TextBox>
<asp:RequiredFieldValidator ID="valEmpName" runat="server" ControlToValidate="txtEmpName"
EnableClientScript="false" ErrorMessage="RequiredFieldValidator" Text="*" Display="Dynamic"
ValidationGroup="ButtonClick"></asp:RequiredFieldValidator>
<asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Button" ValidationGroup="ButtonClick" />
</div>
</form>
</body>
</html>
。请参阅CustomValidator not working well。
注意:客户端验证问题出现在此处:Whether to use Page_IsValid or Page_ClientValidate() (for Client Side Events)
MARKUP
protected void Button1_Click(object sender, EventArgs e)
{
string value = txtEmpName.Text;
SubmitEmployee(value);
}
代码背后
{{1}}
参考:
答案 0 :(得分:35)
验证发生在Page_Load
之后,但在事件处理程序之前(请参阅http://msdn.microsoft.com/en-us/library/ms178472(v=VS.100).aspx)。
如果您的按钮未导致验证,则必须手动触发Page.Validate.
您可能不会在(1)您致电Page.IsValid
或(2)控件之后询问Page.Validate
,导致验证是回发的来源/包含在其中。
如果您需要在事件处理程序触发之前进行验证,则可以使用:
if (Page.IsPostback)
{
Page.Validate( /*Control Validation Group Name Optional*/ );
if (Page.IsValid)
{
//Do some cool stuff
}
}
您可能还需要考虑重新设计,因此您无需这样做。
在处理导致验证的控件的事件处理程序中,Page.IsValid
保证可用。在所有其他情况下,重新请求验证通常更安全。用于处理具有验证器的表单上的提交的一种模型:
void btnSubmit_Click(object sender, EventArgs e)
{
this.UpdateGUIWithSubmitRequest();
if (Page.IsValid)
{
this.ProcessSuccessfulSubmission();
}
else
{
this.ProcessInvalidSubmission();
}
}
如果您使用的CustomValidator
验证步骤非常昂贵,您可以考虑在HttpResponse.Cache
中缓存结果,这样您就不必重新验证是否多次调用Page.Validate发生。
void CustomValidator_ServerValidate(object source, ServerValidateEventArgs args)
{
CustomValidator self = (CustomValidator)source;
string validatorResultKey = self.ClientID;
bool? validatorResult = Context.Items[validatorResultKey] as bool?;
if (validatorResult.HasValue)
{
args.IsValid = validatorResult.Value;
return;
}
bool isValid = this.DoSomethingVeryTimeConsumingOrExpensive();
Context.Items[validatorResultKey] = isValid;
args.IsValid = isValid;
}
当然,这取决于您的体系结构,以及您是否能够假设在初始验证期间通过/失败的验证在同一页面生命周期的后续验证期间仍然通过/失败。
答案 1 :(得分:0)
提交按钮应具有与验证器控件相同的验证组。例如
<asp:Button Text=" Submit " runat="server" ID="btnSubmit" OnClick="btnSubmit_Click" ValidationGroup="vgCustomerValidation" />