【问题标题】:Request ASP.NET page async (ajax) update without send whole page to server请求 ASP.NET 页面异步(ajax)更新而不将整个页面发送到服务器
【发布时间】:2014-06-20 06:26:18
【问题描述】:

是否有一种简单的方法可以发出 ASP.NET AJAX 请求(来自客户端)以更新更新面板,而无需将整个页面从客户端发送到服务器(可能通过手动调用一些内部 MS javascript 来启动异步更新请求)?

背景:

我们有一个非常简单的 Intranet 页面,它只显示一些状态(因此它不需要维护视图和控制状态)。它需要非常频繁地刷新(大约每秒一次)。

为了简单起见,我通过 Timer 和 UpdatePanel 实现了这一点:

<asp:Timer ID="Timer" runat="server" Interval="1000" />

<asp:UpdatePanel ID="UpdatePanel" runat="server" >
    <Triggers>
        <asp:AsyncPostBackTrigger ControlID="Timer" EventName="Tick" />
    </Triggers>
    <ContentTemplate>
    <%-- content here --%>
    </ContentTemplate>
</asp:UpdatePanel>

这很好用,但是远程客户端更新速度较慢,有时会“阻塞”(浏览器加载页面很长时间)。

我通过从页面中完全剥离视图和控件状态(重写 Page 类并停止存储到视图状态元素)并主要通过配置 IIS 动态内容压缩来部分解决了这个问题。这解决了大部分问题 - 因为从服务器到客户端的使用带宽迅速下降(因此更新更快)。

从客户端到服务器的流量仍然相当可观——因为基本​​上客户端将页面发送回服务器;并且它还以未压缩的方式发送它。我们不需要处理任何控制事件或状态更改 - 所以我们不需要服务器上的页面。

我是否有任何选择如何向服务器发送快速 AJAX 请求以请求 UpdatePanel 更新(可能我需要调用一些 MS 内部 javascript 方法来启动异步请求 - 我只是不知道如何找到它并且叫它)。

【问题讨论】:

    标签: javascript asp.net ajax updatepanel


    【解决方案1】:

    您可以从您的 javascript 中调用 __doPostBack 函数,并将更新面板的 id 作为第一个参数(事件目标)。 示例:

    <div id="somediv" onclick="__doPostBack('<%=UpdatePanel.ClientID%>)', '');">
    

    这应该会触发“部分回发”并且应该只刷新更新面板...这是您的意思吗? 第二个参数是事件参数。你可以像这样得到这个服务器端:

    Request.Params.Get("__EVENTARGUMENT");
    

    【讨论】:

    • 感谢您的建议。一个小的调整 -> 它应该是 __doPostBack('',... 它成功了!但是我仍然需要小心输入控件(甚至隐藏字段) - 因为它们的值是被发送回服务器
    • @Jan,确实,如果你在你的 aspx 页面中定义了这个,clientid 可以通过 简单地检索。例如,如果您在外部 javascript 文件中,并且出于某种原因想要调用 __doPostBack 函数,您可以自己输入 de clientid。我根据您的更新更改了答案以清除问题。如果我的回答对您有帮助,您可以将其标记为已接受的答案,以便将来也可以帮助其他人
    • 谢谢杰罗恩!顺便提一句。您是如何学习 MS javascript 功能的 - 通过调试客户端代码,或者有什么可推荐的指南?
    • @Jan 真的不知道我是怎么学到的,但是当使用框架(如本例中的 asp.net Web 表单)时,我总是尝试深入一点。 __doPostBack 函数由 asp.net 生成,主要用于 AutoPostbak 属性设置为 true 的控件。这些控件使用该功能让服务器知道它们已被触发。 eventtarget 是控件名称,eventargument 参数是可选参数。仔细查看您的一个 aspx 页面的源(在您的浏览器中)并了解其背后的魔力可能会很有趣。
    【解决方案2】:
    <asp:Timer ID="Timer" runat="server" Interval="1000" />
    
    <asp:UpdatePanel ID="UpdatePanel" runat="server" updatemode="conditional" >
        <Triggers>
            <asp:AsyncPostBackTrigger ControlID="Timer" EventName="Tick" />
        </Triggers>
        <ContentTemplate>
        <%-- content here --%>
        </ContentTemplate>
    </asp:UpdatePanel>
    

    我只是在更新面板中提供updatemode="conditional",该面板仅更新 udate 面板

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-31
      • 2012-08-30
      • 2017-04-12
      • 2012-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多