zoukankan      html  css  js  c++  java
  • [转]ASP.NET验证发生前无法调用 Page.IsValid。应在 CausesValidation=True 且已启动回发的控件

    在ASP.Net中,为了方便表单的验证,提供了验证控件来完成表单输入数据的验证。这些验证控件确实是功能强大,为写表单程序提供了极大的便利。但是,在不熟悉的情况下,经常碰到问题。其中,最常见的是遇到错误:在验证发生前无法调用 Page.IsValid。

    这个问题我认为是很多朋友受了《深入接触ASP.Net》这本书。这本书在网友间流传甚广,也确实是一本不错的入门书,但是错误也有一些,比如这里。在该书论述到验证组件的时候,演示RequiredFieldValidator的用法时,有这样一个程序:

    RequiredFieldValidator.aspx:

    <% @ Page Language="C#" %>
    <Script Language="C#" Runat="Server">
    public void Page_Load(Object src,EventArgs e)
    {
        if(Page.IsPostBack)
    {
            if(Page.IsValid)
           {
              show.Text = "已经通过验证";
          }
         else
        {
              show.Text = "没有通过验证";
        }
    }
    }
    </script>
    <html>
    <head>
    <title></title>
    </head>
    <body>
    <form runat="server">
    <table>
    <tr><td colspan=2 align="center"><b>RequiredFieldValidator控件演示</b></td></tr>
    <tr>
    <td>姓名:</td>
    <td><asp:TextBox id="name" runat="server" />*
       <asp:RequiredFieldValidator id="rfv1" runat="server"
        ControlToValidate="name"
        Display="Static"
       >(请填写姓名)
       </asp:RequiredFieldValidator>
    </td>
    </tr>
    <tr>
    <td>年龄:</td>
    <td><asp:TextBox id="age" runat="server" />*
       <asp:RequiredFieldValidator id="rfv2" runat="server"
        ControlToValidate="age"
        Display="Static"
       >(请填写年龄)
       </asp:RequiredFieldValidator>
    </td>
    </tr>
    <tr>
    <td><asp:Button Text="提交" runat="server" /></td>
    <td></td>
    </tr>
    </table>
    <hr>
    <asp:Label id="show" ForeColor="red" runat="server" />

    </form>
    </body>
    </html>

    运行这个程序,就发生了错误:在验证发生前无法调用 Page.IsValid。应在控件的事件处理程序中使用 CausesValidation=True 或在调用 Page.Validate 后对它进行查询。

    这个问题的发生来自作者的一个小疏忽。其实,在点击提交按钮时,程序先进行了验证,验证通过后才会和服务器交互(这里是重新加载,调用了Page_Load)。

    问题的根源是对于asp:Button控件,点击的时候是默认先进行表单的验证的。有的朋友希望在表单里有两个按钮,其中有的按钮执行的操作和表单本身无关,不需要验证,但也默认必须进行验证,对程序设计上造成不少烦恼。

    其实,这个问题很好解决。Button控件有一个属性 CauseValidation,默认是true。只需要将此属性设为false,就不会引发表单验证了。需要验证的时候,可以手工调用验证代码:验证控件.Validate()或者Page.Validate()进行验证。

  • 相关阅读:
    BUU-singal
    BUU-[GWCTF 2019]re3
    BUU-[2019红帽杯]xx
    BUU-BabyDriver
    BUU-simple CPP
    BUU-BJD hamburger competition
    BUU-Youngter-drive
    用于阻止div上的事件和div上的按钮的事件同时触发
    错误: java.lang.reflect.InvocationTargetException
    easy ui datagrid 让某行复选框不能选中
  • 原文地址:https://www.cnblogs.com/shenbing/p/5276030.html
Copyright © 2011-2022 走看看