我不在后面的代码中使用Page.IsValid。不过,当我在文本框中提交没有任何值时,我会收到错误消息。
从@Dai的意见,我知道这可以是一个问题,如果在Page_Load中有任何代码在回发中执行。将不会抛出验证错误。
(但是,对于按钮单击处理程序,没有必要检查Page.IsValid)
if (Page.IsPostBack) { string value = txtEmpName.Text; txtEmpName.Text = value + "Appended"; }
题
>为什么服务器端验证不会在Page_Load之前发生?
>为什么当我使用Page.IsValid时它工作正常?
>你能提供任何参考文章来解释这个吗? (不是说 – 总是使用Page.IsValid;但是说什么是强制性方案使用Page.IsValid
更新1
参见ASP.NET Validators Common Misconception
Page.IsValid
is accessible only after runningPage.Validate()
method which is invoked implicitly somewhere afterPage_Load
. In case you keep all of your logic in a Page_Load event handler (which is highly discouraged!),call thePage.Validate()
before checking thePage.IsValid
.
注意:建议不要保留Page_Load中的所有逻辑。如果事件发生在按钮单击事件上,将其移动到按钮单击事件处理程序。如果某事发生在下拉事件上,请将其移动到下拉选择的项目更改事件处理程序。
更新2
看起来,我们需要添加If(Page.IsValid)在按钮点击也如果我们使用自定义验证器与服务器端验证。参见CustomValidator not working well。
注意:客户端验证问题在这里:Whether to use Page_IsValid or Page_ClientValidate() (for Client Side Events)
MARKUP
<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>
CODE BEHIND
protected void Button1_Click(object sender,EventArgs e) { string value = txtEmpName.Text; SubmitEmployee(value); }
参考文献:
> Should I always call Page.IsValid?
> ASP.NET Validation Controls – Important Points,Tips and Tricks
> CustomValidator not working well
解决方法
如果您的按钮不会导致验证,您必须手动启动Page.Validate。
您可能不会询问Page.IsValid,直到(1)您调用Page.Validate或(2)一个控件,导致验证是/包含在回发的源。
如果您需要在事件处理程序启动之前进行验证,您可以使用:
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; }
这当然取决于您的架构100%,以及您是否能够假设在初始验证期间通过/失败的验证在相同页面生命周期的后续验证期间仍然通过/失败。