【问题标题】:ASP.net: Refresh GridView without refreshing the whole page? (AsyncPostBackTrigger really slow)ASP.net:刷新 GridView 而不刷新整个页面? (AsyncPostBackTrigger 真的很慢)
【发布时间】:2017-06-13 15:53:59
【问题描述】:

我是 ASP.net 的新手,正在尝试让一些超级慢的代码运行得更快。

目前,代码在 UpdatePanel 中使用 GridView。 UpdatePanel 位于模式弹出窗口中。每当打开该模式时,必须刷新内容。我们通过使用 AsyncPostBackTrigger 来做到这一点,据我所知,它会在返回和呈现表格之前经历整个页面生成周期。

.aspx.cs

public void UpdateWatchListPopup(object sender, System.EventArgs e)
{
    grdWatchList.DataBind();
}

.aspx:

<asp:UpdatePanel ID="UpdatePanel3" runat="server" >

    <Triggers>
        <asp:AsyncPostBackTrigger ControlID="UpdateWatchListPopupBtn" EventName="Click" /> 
    </Triggers>

    <ContentTemplate>

        <div style="display:none">
            <asp:Button ID="UpdateWatchListPopupBtn" runat="server" Text="" OnClick="UpdateWatchListPopup" />
        </div>

        <asp:GridView ID="grdWatchList" OnSorting="grdWatchList_Sorting" runat="server" OnRowCreated="grdWatchList_RowCreated" OnRowDataBound="grdWatchList_RowDataBound" AllowSorting="true" AutoGenerateColumns="False">
            <Columns>
                <asp:TemplateField>

这真的很慢(显示结果需要5秒),并不是因为要返回的数据很多!我的猜测是 Page_Load() 正在做一堆不必要的计算来刷新特定的 GridView。

还有其他异步刷新 GridView 的方法吗?我考虑过使用 WebMethod 来获取数据,然后从客户端手动重新填充表。我想知道是否还有其他选择?

谢谢

【问题讨论】:

  • 第一次加载页面也需要 5 秒吗?
  • 是的。基本上,整个应用程序都在一个页面中,并且在开始时获取所有数据。

标签: c# asp.net gridview updatepanel postback


【解决方案1】:

您可能需要考虑使用客户端网格,我已经使用 Jquery 数据表已经有一段时间了,主要使用 ASPNET MVC,但您也可以将它用于 Web 表单。这真的很容易上手,那里有很多很好的例子,最好的部分是没有回发。该工具自带分页、排序、搜索等功能。

这是在 Web 表单上运行的 Jquery 数据表的一个很好的示例 http://datatables.extrared.net/Sample/

您可以从这里开始使用 Jquery 数据表 https://datatables.net/

【讨论】:

  • 这可能是最好的解决方案,尽管它需要重写整个应用程序。
【解决方案2】:

您不一定需要 PostBack 来打开弹出窗口。这是一个使用jQuery UI Dialog 的sn-p。

<div id="hiddenGrid" style="display: none">
    <asp:GridView ID="GridView1" runat="server"></asp:GridView>
</div>

<input type="button" value="Open Dialog" onclick="createPopup()" />

<script type="text/javascript">
    function createPopup() {
        var html = document.getElementById('hiddenGrid').innerHTML;
        $('<div />').html(html).dialog({
            resizable: false,
            draggable: true,
            modal: true,
            width: 600,
            height: 800,
            create: function (event, ui) {
                $(".ui-dialog-titlebar").html("<div onclick=\"closePopup()\" class=\"dialog-closeButton\"></div>");
            },
            open: function (event, ui) {
                $('.ui-widget-overlay').bind('click', function () {
                    closePopup();
                })
            }
        });
    }

    function closePopup() {
        $(".ui-dialog-content").dialog("destroy");
    }
</script>

但是如果你必须用 PostBack 打开 Modal,你可以检查它是否是 Async PostBack 并跳过 Page_Load 中你不需要的项目。

protected void Page_Load(object sender, EventArgs e)
{
    if (ScriptManager.GetCurrent(this.Page).IsInAsyncPostBack)
    {
        //updatepanel page load
    }
    else
    {
        //normal page load
    }
}

【讨论】:

  • 哦,谢谢!我不知道您是否可以检测到执行是否是 PostBack。我尝试实施该解决方案,但它仍然很慢(尽管执行时间有所改善)。除了 Page_Load() 之外,是否还有其他元素在每次加载时执行?
  • 可能的话,看看Page Life Cycle。在 Page_Load 之前的方法中可能有一些东西会减慢速度。
猜你喜欢
  • 2012-02-22
  • 2023-04-01
  • 2014-03-23
  • 1970-01-01
  • 2014-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-18
相关资源
最近更新 更多