【问题标题】:How do you get a single column of a gridview to auto-update without refreshing the whole page?如何在不刷新整个页面的情况下让 gridview 的单列自动更新?
【发布时间】:2013-06-22 17:57:48
【问题描述】:

我有一个包含多列的网格视图,但只有其中一列应该动态更改。每行都有一个“状态”值,我需要调用数据库来更新它。我已经编写了一个函数来执行该调用,但是我编写的用于更新它的当前方法会刷新整个页面。这很突兀,因为刷新会删除状态(页面其他区域中的选定值、滚动位置等)。

这是我编写的尝试设置的代码:

<div class = "my_gridview">
    <asp:Timer ID = "timer_1" OnTick = "timer_1Tick" runat = "server" Interval = "25" />
        <asp:UpdatePanel ID = "update_panel" UpdateMode = "Conditional" runat = "server">
        <Triggers>
            <asp:AsyncPostBackTrigger ControlID = "timer_1" EventName = "Tick" />
        </Triggers>
        <ContentTemplate>
            <asp:GridView ID="my_gridview" runat="server" AutoGenerateColumns = "False" 
                GridLines="None" Width="100%" AllowSorting="True" 
                CssClass="table table-bordered x-condensed cameraDetails" OnRowDataBound = "my_list_RowDataBound"
                EmptyDataText = "There are no generated heatmaps">
                <Columns>
                    <asp:TemplateField meta:resourceKey = "StringSourceID">
                    <HeaderTemplate>
                        <asp:Label ID = "srcTitleLbl" runat="server" Text = "Source" />
                    </HeaderTemplate>
                        <ItemTemplate>
                            <asp:Label ID = "srcLbl" runat="server" CssClass="LinkBtn_Type" meta:resourceKey="srcLblResource" />
                        </ItemTemplate>
                    </asp:TemplateField>

                    <asp:TemplateField meta:resourceKey = "StringStatus">
                    <HeaderTemplate>
                        <asp:Label ID = "statusTitleLbl" runat="server" Text = "Status" />
                    </HeaderTemplate>
                        <ItemTemplate>
                            <asp:Label ID = "statusLbl" runat="server" CssClass="LinkBtn_Type" meta:resourceKey="statusLblResource" />
                        </ItemTemplate>
                    </asp:TemplateField>

                </Columns>
            </asp:GridView>
            </ContentTemplate>
        </asp:UpdatePanel>
    </div>

在不刷新整个页面的情况下如何做到这一点?

【问题讨论】:

    标签: asp.net ajax gridview


    【解决方案1】:

    UpdatePanel 会进行部分回发,但这仍会经历页面生命周期,这会导致状态被移除。您可以调查诸如项目选择(复选框、行等)之类的持久性内容,但您很可能会花费大量时间来创建它并且维护它将是一场噩梦。

    要真正避免页面生命周期并实现您所描述的用户体验,请使用客户端解决方案,例如纯 JavaScript、KnockoutJS、Backbone 或 AngularJS。这些方法将在向服务器发送/检索数据时单独保留您的页面状态,然后可能会更新页面的某些部分。

    【讨论】:

    • 有趣。我对 ASP.NET 无法处理部分页面更新的所有 ajax 函数感到惊讶。我正在寻找一个 C# 函数以某个定期间隔运行(因此是计时器),然后根据新的结果值更新 gridview 中的值。这只能通过额外的外部 javascript 功能实现?
    • @Jim - 并非完全可能,但您将花费大量时间来维护页面状态,以处理您希望监控的所有用户交互,您很可能希望放弃这个概念,当然还有人来在您查看您的代码之后,您可能会希望您的家庭住址与您“谈论”代码。像 KnockoutJS 这样的客户端解决方案允许视图模型与 DOM 同步(双向绑定),因此如果您通过操作更改 UI,则视图模型将被更新,反之亦然,如果随后更新视图模型DOM 元素可以更新。
    • @Jim - 如果您愿意,您可以在一个页面上使用 KnockoutJS,而不是 Web 应用程序的其余部分。我通常有一个 shell .aspx 页面来利用 ASP.NET 的安全功能,然后使用 KnockoutJS 来处理客户端,我在服务器上使用 ASP.NET AJAX 页面方法、Web 服务或 ASP.NET Web API -并使用 jQuery 创建对服务器端片段的 AJAX 调用。
    • @Jim - 要回答您对 ASP.NET AJAX 无法处理真正的部分页面更新感到惊讶的原始问题,您必须意识到 UpdatePanels 被设计为一个穷人的 AJAX 环绕现有的 ASP.NET 服务器控件。 ASP.NET 页面生命周期存在于幕后。 UpdatePanel 提供了一种快速的方法来增强您的 ASP.NET 服务器控件并提供更无缝的用户体验,但是当您执行任何不寻常的操作时,它们的代价是难以使用。
    • @Jim - 微软已经放弃了 ASP.NET AJAX 库并正式支持 jQuery,他们甚至贡献了一些核心的 jQuery 功能(例如模板)。 ASP.NET MVC 是微软的服务器解决方案,它避免了页面生命周期和服务器控制。 ASP.NET 页面生命周期在某些用途中过去和现在都是一个非常可行的选项,因此 Microsoft 继续更新 ASP.NET WebForms 框架的原因。不过,随着客户端功能的兴起,正是用户体验促使开发人员转向 WebForms 的替代方案。
    猜你喜欢
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多