天天看点

让服务器端控件同时执行客户端脚本和服务器端代码

让服务器控件的事件同时执行客户端脚本和服务器端代码

    问题:

        有时候我们需要一个服务器控件同时执行客户端脚本(如javascript)和服务器端代码。比如在进行表单验证的时候,希望先在客户端进行验证,只有通过验证才执行后台代码。这样可以避免不必要的postback,提供更好的用户体验。

    解决方案:

        在不同的地方分别注册客户端和服务器端事件处理函数。示例如下:

    Web页面代码(仅HTML部分):

    <HTML>

        <HEAD>

            <title>DoubleSidesHandler</title>

            <script language="javascript">

                function submitClientHandler()

                {

                    var len = document.form1.txtName.value.length;

                    if(len < 3)

                    {

                        window.alert("required at least 3 letters!");

                        return false;

                    }

                    window.alert(document.form1.txtName.value);

                    return true;

                }

                function initHandler()

                    var elem = document.form1.btnSubmit;

                    if(elem)

                        elem.onclick = submitClientHandler;

            </script>

        </HEAD>

        <body onload="initHandler()">

            <form id="form1" method="post" runat="server">

                Enter your name:

                <asp:TextBox ID="txtName" Width="200px" Runat="server"></asp:TextBox>

                <br>

                <asp:Button ID="btnSubmit" Text="Submit" Runat="server" OnClick="SubmitServerHandler"></asp:Button>

            </form>

        </body>

    </HTML>

     后台代码(仅事件处理函数):

     protected void SubmitServerHandler(object sender, System.EventArgs e)

     {

        Response.Write("hello!" + txtName.Text + "<br>");

     }

     分析:

     这里客户端和服务器端的事件处理函数分别是submitClientHandler()和SubmitServerHandler()。submitClientHandler()在页面加载完成时(onload事件中)注册,这时才能获得对服务器控件的引用。SubmitServerHandler()在Button控件的OnClick属性中注册,这里注意该方法须声明为protected以上级别,这样才能在页面中访问。完成这两步注册后,页面会先后执行客户端和服务器端时间处理函数。

     那么,怎么才能控制对服务器端代码的调用?看submitClientHandler()函数,如果返回false,那么就不执行SubmitServerHandler(),如果返回true,就会继续调用SubmitServerHandler()。

本文转自一个程序员的自省博客园博客,原文链接:http://www.cnblogs.com/anderslly/archive/2006/09/30/doublesidesevent.html,如需转载请自行联系原作者。

继续阅读