65.9K
CodeProject 正在变化。 阅读更多。
Home

在 ASP.NET UpdatePanel 中使用 jQuery

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.90/5 (40投票s)

2013年6月3日

CPOL

2分钟阅读

viewsIcon

185570

downloadIcon

2054

在同一页面中使用 jQuery 和 UpdatePanel。

引言

在开发 ASP.NET Webforms 应用程序时,我发现无法同时使用 JQueryUpdatePanel! 我深入研究了这个问题,发现 UpdatePanel 的部分 回发 正在移除 JQuery 事件。 然后我尝试了无数次,让它与 UpdatePanelJQuery 一起工作! 我搜索了很多,并浏览了很多博文,但无法从中找到确切的输出!! 

最后,我找到了一个解决方案!

为了说明这个过程,我制作了一个演示项目,其中有两个功能齐全的页面。 在 Page1.aspx 中,我尝试使用 JQuery 和服务器端事件来添加两个数字。 在 '+' 按钮上,我从 JQuery 添加了两个数字,在 '+(*)' 按钮上,我从服务器端事件添加了两个数字。 当 page1.aspx 正在加载时,JQuery 事件绑定发生在 document.Ready 中。

部分回发阻止了 jquery 的工作。 在这个解决方案中,我克服了这个问题。 我通过 endRequest 事件解决了这个问题,该事件在异步回发完成后触发,并且控制已返回到浏览器。  

项目源代码

使用代码

在项目中,您将有两个页面,一个用于 jQuery 在 Update Panel 中不起作用 (Page1.aspx),另一个用于 jQuery 在 Update Panel 中起作用 (Page2.aspx)。

Page1.aspx 中,jquery 不起作用。

在 + 按钮中将使用 jquery 添加两个数字,而 +(*) 按钮将使用客户端方法添加两个数字。 这是 Page1.aspx 代码: 

<%@ Page Language="C#" AutoEventWireup="true" 
    CodeBehind="Page1.aspx.cs" Inherits="jQuerywithinUpdatePanel.Page1" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Page-1</title>

    <script src="js/jquery-1.7.2.min.js" 
         type="text/javascript"></script>

    <script type="text/javascript">
        //
        function IsValidNumber() {
            if ($(this).val() == "") {
                //$(this).val("0");
                alert("Please enter valid value!");
                $(this).focus();
            }
            else if ($.isNumeric($(this).val()) == false) {
                alert("Please enter valid value!");
                $(this).focus();
            }
        }

        function Add() {
            var Num1 = parseInt($('#txtNum1').val());
            var Num2 = parseInt($('#txtNum2').val());
            var Result = Num1 + Num2;
            $('#txtResult').val(Result);
        }

        $(document).ready(function() {
            $('#txtNum1').change(IsValidNumber);
            $('#txtNum2').change(IsValidNumber);
            $('#btnClientAdd').click(Add);
        });
    </script>

</head>
<body>
    <form id="form1" runat="server">
    <asp:ScriptManager ID="SM" runat="server">
    </asp:ScriptManager>
    <asp:UpdatePanel ID="upMain" runat="server" UpdateMode="Conditional">
        <ContentTemplate>
            <div>
                <table>
                    <tr>
                        <td>
                            <input type="button" id="btnClientAdd" value=" + " />
                        </td>
                        <td>
                            <asp:TextBox ID="txtNum1" 
                                runat="server" Width="100px"></asp:TextBox>
                            +
                            <asp:TextBox ID="txtNum2" 
                                runat="server" Width="100px"></asp:TextBox>
                            =
                            <asp:TextBox ID="txtResult" 
                                 runat="server" Width="100px"></asp:TextBox>
                        </td>
                        <td>
                            <asp:Button ID="btnServerAdd" runat="server" 
                                 Text=" +(*) " OnClick="btnServerAdd_Click" />
                        </td>
                    </tr>
                </table>
            </div>
        </ContentTemplate>
    </asp:UpdatePanel>
    </form>
</body>
</html>

 和 Page1.aspx.cs 代码:  

using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;

namespace jQuerywithinUpdatePanel
{
    public partial class Page1 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void btnServerAdd_Click(object sender, EventArgs e)
        {
            int Num1 = Convert.ToInt16(txtNum1.Text);
            int Num2 = Convert.ToInt16(txtNum2.Text);
            int Result = Num1 + Num2;
            txtResult.Text = Result.ToString();
        }
    }
} 

在这里,每次单击 '+' 按钮时,都会从 JQuery 添加两个数字。 但是在单击按钮 '+(*)' 上的服务器端事件后,JQuery 事件不再触发! 这对我来说是个问题!

我在Page2.aspx中展示了解决方案。

在 Page2.aspx 中,我使用了另一个函数来完成 JQuery 事件绑定,该函数在部分回发发生后起作用,并在 pageEndRequest 的 document.Ready 上绑定 JQuery 事件。 

这是 Page2.aspx 代码

<%@ Page Language="C#" AutoEventWireup="true" 
      CodeBehind="Page2.aspx.cs" Inherits="jQuerywithinUpdatePanel.Page2" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
    <title>Page-2</title>

    <script src="js/jquery-1.7.2.min.js" 
          type="text/javascript"></script>

    <script type="text/javascript">
        //
        function IsValidNumber() {
            if ($(this).val() == "") {
                //$(this).val("0");
                alert("Please enter valid value!");
                $(this).focus();
            }
            else if ($.isNumeric($(this).val()) == false) {
                alert("Please enter valid value!");
                $(this).focus();
            }
        }

        function Add() {
            var Num1 = parseInt($('#txtNum1').val());
            var Num2 = parseInt($('#txtNum2').val());
            var Result = Num1 + Num2;
            $('#txtResult').val(Result);
        }

        function InIEvent() {
            $('#txtNum1').change(IsValidNumber);
            $('#txtNum2').change(IsValidNumber);
            $('#btnClientAdd').click(Add);
        }

        $(document).ready(InIEvent);
    </script>

</head>
<body>
    <form id="form1" runat="server">
    <asp:ScriptManager ID="SM" runat="server">
    </asp:ScriptManager>

    <script type="text/javascript">
        Sys.WebForms.PageRequestManager.getInstance().add_endRequest(InIEvent);
    </script>

    <asp:UpdatePanel ID="upMain" 
           runat="server" UpdateMode="Conditional">
        <ContentTemplate>
            <div>
                <table>
                    <tr>
                        <td>
                            <input type="button" 
                              id="btnClientAdd" value=" + " />
                        </td>
                        <td>
                            <asp:TextBox ID="txtNum1" runat="server" 
                              Width="100px"></asp:TextBox>
                            +
                            <asp:TextBox ID="txtNum2" runat="server" 
                              Width="100px"></asp:TextBox>
                            =
                            <asp:TextBox ID="txtResult" 
                              runat="server" Width="100px"></asp:TextBox>
                        </td>
                        <td>
                            <asp:Button ID="btnServerAdd" runat="server" 
                                    Text=" +(*) " OnClick="btnServerAdd_Click" />
                        </td>
                    </tr>
                </table>
            </div>
        </ContentTemplate>
    </asp:UpdatePanel>
    </form>
</body>
</html>

Page2.aspx.cs 代码: 

using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;

namespace jQuerywithinUpdatePanel
{
    public partial class Page2 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void btnServerAdd_Click(object sender, EventArgs e)
        {
            int Num1 = Convert.ToInt16(txtNum1.Text);
            int Num2 = Convert.ToInt16(txtNum2.Text);
            int Result = Num1 + Num2;
            txtResult.Text = Result.ToString();
        }
    }
}

在这里,pageEndRequest 在 UpdatePanel 的部分回发发生后绑定 JQuery 事件。 然后 JQuery 和服务器端两个事件都运行良好!!

PageRequestManagerdocument.Ready 添加一个 endRequest,这使得部分回发后的 jQuery 绑定成为可能,并且 Jquery 仍然保持启用状态。 请 确保在 aspx 文件中添加这些行 以启用 jquery 事件绑定,这将为您解决问题! 

<script type="text/javascript">
    Sys.WebForms.PageRequestManager.getInstance().add_endRequest(InIEvent);
</script>

希望它能节省您的时间! 

关注点   

jQuery 总是很有趣,但在使用 UpdatePanel 和 jQuery ASP.NET 3.5 时,我遇到了一些严重的问题。 经过多次搜索和阅读了许多文章后,我找到了这个解决方案!

参考文献 

我从 这里 找到了一些帮助。 您也可以查看 此链接

© . All rights reserved.