【问题标题】:(ASP.NET) validation control validates before or after control event handler(ASP.NET) 验证控件在控件事件处理程序之前或之后验证
【发布时间】:2019-06-25 12:58:38
【问题描述】:

我是 ASP.NET 的初学者,只是对验证控件的工作原理有一些疑问: 假设我有一本教科书和一个自定义验证,例如:

<asp:TextBox ID="txtTest" runat="server" ValidationGroup="test" OnTextChanged="txtTest_TextChanged" />

<asp:CustomValidator ID="CustomValidator" runat="server" ClientValidationFunction="validatePhoneNumbers"  ErrorMessage="xxx" OnServerValidate="CustomValidator_ServerValidate">*</asp:CustomValidator>

还有一个将表单提交到服务器的按钮

 <asp:Button ID="Button" runat="server" OnClick="Button_Click" Text="Submit" />

假设我禁用了 javascript,所以没有客户端 javascript 验证。

Q1-每个验证控件都有public void Validate ();方法,是不是意味着Validate()方法先被调用,间接调用了CustomValidator_ServerValidate()方法?

Q2-MSDN 文档指出:

如果请求是回发,则调用控制事件处理程序。之后,调用所有验证器控件的 Validate 方法,该方法设置各个验证器控件和页面的 IsValid 属性。

这意味着首先调用 txtTest_TextChanged() 然后调用 CustomValidator_ServerValidate() ,那么检查 Page.IsValid 有什么意义:

protected void txtTest_TextChanged(Object sender, EventArgs e)
{
 if (!Page.IsValid) return;

 lblMessage.Text = "Txt changed!";
}

因为 IsValid 只能在调用控件事件处理程序后设置?

【问题讨论】:

    标签: javascript asp.net .net validation page-lifecycle


    【解决方案1】:

    Page.Validate() 隐式调用Raise PostBackEvent 并引发页面上所有验证器的ServerValidate 事件。

    使用以下代码查看页面事件流并使用验证器。

    <%@ Page Language="C#" Trace="true" TraceMode="SortByTime" %>
    
    <!DOCTYPE html>
    <script runat="server">
        void Page_Load(object sender, EventArgs e)
        {
            Trace.Write("Page_Load call");
        }
    
        protected void txtTest_TextChanged(object sender, EventArgs e)
        {
            Trace.Write("txtTest_TextChanged call");
            //force validation manually to check Page.IsValid
            Page.Validate(); //comment to cause runtime error in the next row
            Trace.Write("Page is valid", Page.IsValid.ToString());
    
        }
        //Server side validation. Never trust user input and client side validation
        protected void CustomValidator_ServerValidate(object source, ServerValidateEventArgs args)
        {
            Trace.Write("CustomValidator_ServerValidate call");
            if (args.Value == "123")
                args.IsValid = false;
        }
    
        protected void Button_Click(object sender, EventArgs e)
        {
            //if (Page.IsValid)
            //{
            //    Trace.Write("Button_Click call. Page.IsValid");
            //}
            Trace.Write("Button_Click call");
        }
    </script>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title>Page event flow</title>
        <script>
            //client side validation. Never trust it.
            //It is for user convenience only
            function validatePhoneNumbers(sender, args) {
                console.log('validatePhoneNumbers',sender.ControlToValidate);
                if (args.Value == '1')
                    args.IsValid = false;
            }
        </script>
    </head>
    <body>
        <form id="form1" runat="server">
            <div>
                <%-- Show client and server side validation errors --%>
                <asp:ValidationSummary runat="server" ID="vsSummary" />
                <%-- CausesValidation is false by default. No server validation before OnTextChanged --%>
                <asp:TextBox ID="txtTest" runat="server" 
                    AutoPostBack="true" 
                    OnTextChanged="txtTest_TextChanged" />
                <%-- ControlToValidate is optional for CustomValidator and mandatory for other validators --%>
                <asp:CustomValidator ID="CustomValidator" runat="server" 
                    ClientValidationFunction="validatePhoneNumbers" ControlToValidate="txtTest"  
                    ErrorMessage="xxx" OnServerValidate="CustomValidator_ServerValidate">*</asp:CustomValidator>
                <%-- CausesValidation is true by default. Server validation occurs before OnClick --%>
                <asp:Button ID="Button" runat="server" OnClick="Button_Click" Text="Submit" />
            </div>
        </form>
    </body>
    </html>
    

    【讨论】:

      猜你喜欢
      • 2010-11-21
      • 2011-09-17
      • 2011-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-18
      • 2021-10-11
      相关资源
      最近更新 更多