asp.net – Page.IsValid如何工作?

前端之家收集整理的这篇文章主要介绍了asp.net – Page.IsValid如何工作?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个requiredFieldValidator的以下代码。 EnableClientScript属性在验证控件中设置为“false”。我也在浏览器中禁用脚本。

我不在后面的代码中使用Page.IsValid。不过,当我在文本框中提交没有任何值时,我会收到错误消息。

从@Dai的意见,我知道这可以是一个问题,如果在Page_Load中有任何代码在回发中执行。将不会抛出验证错误

(但是,对于按钮单击处理程序,没有必要检查Page.IsValid)

  1. if (Page.IsPostBack)
  2. {
  3. string value = txtEmpName.Text;
  4. txtEmpName.Text = value + "Appended";
  5. }

>为什么服务器端验证不会在Page_Load之前发生?
>为什么当我使用Page.IsValid时它工作正常?
>你能提供任何参考文章来解释这个吗? (不是说 – 总是使用Page.IsValid;但是说什么是强制性方案使用Page.IsValid

更新1

参见ASP.NET Validators Common Misconception

Page.IsValid is accessible only after running Page.Validate() method which is invoked implicitly somewhere after Page_Load. In case you keep all of your logic in a Page_Load event handler (which is highly discouraged!),call the Page.Validate() before checking the Page.IsValid.

注意:建议不要保留Page_Load中的所有逻辑。如果事件发生在按钮单击事件上,将其移动到按钮单击事件处理程序。如果某事发生在下拉事件上,请将其移动到下拉选择的项目更改事件处理程序。

更新2

看起来,我们需要添加If(Page.IsValid)在按钮点击也如果我们使用自定义验证器与服务器端验证。参见CustomValidator not working well

注意:客户端验证问题在这里:Whether to use Page_IsValid or Page_ClientValidate() (for Client Side Events)

MARKUP

  1. <html xmlns="http://www.w3.org/1999/xhtml">
  2. <head runat="server">
  3. <title></title>
  4. <script type="text/javascript">
  5. alert('haiii');
  6. </script>
  7.  
  8. </head>
  9. <body>
  10. <form id="form1" runat="server">
  11. <div>
  12. <asp:ValidationSummary runat="server" ID="vsumAll" DisplayMode="BulletList" CssClass="validationsummary" ValidationGroup="ButtonClick" />
  13. <asp:TextBox ID="txtEmpName" runat="server"></asp:TextBox>
  14. <asp:requiredFieldValidator ID="valEmpName" runat="server" ControlToValidate="txtEmpName"
  15. EnableClientScript="false" ErrorMessage="requiredFieldValidator" Text="*" Display="Dynamic"
  16. ValidationGroup="ButtonClick"></asp:requiredFieldValidator>
  17. <asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Button" ValidationGroup="ButtonClick" />
  18. </div>
  19. </form>
  20. </body>
  21. </html>

CODE BEHIND

  1. protected void Button1_Click(object sender,EventArgs e)
  2. {
  3. string value = txtEmpName.Text;
  4. SubmitEmployee(value);
  5. }

参考文献:

> Should I always call Page.IsValid?
> ASP.NET Validation Controls – Important Points,Tips and Tricks
> CustomValidator not working well

解决方法

验证发生在Page_Load之后,但在事件处理程序之前(见 http://msdn.microsoft.com/en-us/library/ms178472(v=VS.100).aspx)。

如果您的按钮不会导致验证,您必须手动启动Page.Validate。

您可能不会询问Page.IsValid,直到(1)您调用Page.Validate或(2)一个控件,导致验证是/包含在回发的源。

如果您需要在事件处理程序启动之前进行验证,您可以使用:

  1. if (Page.IsPostback)
  2. {
  3. Page.Validate( /*Control Validation Group Name Optional*/ );
  4. if (Page.IsValid)
  5. {
  6. //Do some cool stuff
  7. }
  8. }

您可能还需要考虑重新设计,因此您不需要这样做。

在处理导致验证的控件的事件处理程序中,Page.IsValid保证可用。在所有其他情况下,重新请求验证通常更安全。一种用于处理具有验证器的表单上的提交的模型:

  1. void btnSubmit_Click(object sender,EventArgs e)
  2. {
  3. this.UpdateGUIWithSubmitRequest();
  4. if (Page.IsValid)
  5. {
  6. this.ProcessSuccessfulSubmission();
  7. }
  8. else
  9. {
  10. this.ProcessInvalidSubmission();
  11. }
  12. }

如果您使用的CustomValidator具有非常昂贵的验证步骤,您可以考虑将结果缓存在HttpResponse.Cache中,以便在发生对Page.Validate的多个调用时不必重新验证。

  1. void CustomValidator_ServerValidate(object source,ServerValidateEventArgs args)
  2. {
  3. CustomValidator self = (CustomValidator)source;
  4. string validatorResultKey = self.ClientID;
  5. bool? validatorResult = Context.Items[validatorResultKey] as bool?;
  6. if (validatorResult.HasValue)
  7. {
  8. args.IsValid = validatorResult.Value;
  9. return;
  10. }
  11.  
  12. bool isValid = this.DoSomethingVeryTimeConsumingOrExpensive();
  13. Context.Items[validatorResultKey] = isValid;
  14. args.IsValid = isValid;
  15. }

这当然取决于您的架构100%,以及您是否能够假设在初始验证期间通过/失败的验证在相同页面生命周期的后续验证期间仍然通过/失败。

猜你在找的asp.Net相关文章