如何在页面回发后保持Asp-Net GridView数据(来自SignalR)

How to persist Asp Net GridView data (coming from SignalR) after page postback?

本文关键字:数据 GridView Asp-Net 来自 SignalR      更新时间:2023-12-17

我在DotNetNuke CMS中创建模块。我不需要编辑我的数据,只需要显示具有排序和分页功能。存在具有DataTable的asp:GridView控件作为数据源。在Page_Load事件中,一些带有数据的行被添加到dataTable和正确显示。排序和分页也可以。在GridView中维护数据(出于排序目的)使用了ViewState。我选择使用ViewState而不是服务器过载,传入数据不必是安全的。对于传入数据我使用SignalR,所以javascript函数从服务器(hub)接收数据。发现我将从javascript web方法(C#)AddNewRowToDataTable调用(DateTime时间、字符串名称、双值…)将参数传递给方法。不幸的是,web方法必须是静态的,这就是ViewState可以不能在其中使用。因此,如果在添加新行时不能使用ViewState,我将丢失所有数据。这没有帮助:

[WebMethod]
public static void AddNewRowToDataTable(DateTime time, string name, double value)
{
    Page page = HttpContext.Current.Handler as Page;
    if (page != null)
    {
        if (page.ViewState["dtValues"] != null)
        {
            // Get the DataTable from ViewState and inserting new data to it.
            DataTable dtValues = (DataTable)page.ViewState["dtValues"];
            // Add the new row.
            dtValues.Rows.Add(new object[] { time, name, value });
            // Rebind the GridView control to show inserted data.
            BindGridView();
        }
    }
}

错误无法访问受保护的成员"System.Web.UI.Control.ViewState"通过类型为"System.Web.UI.Page"的限定符;限定符必须是类型为"Christoc.Modules.DNNSignalR.View"(或从中派生)

我宁愿不使用Session来维护数据,因为我不想在服务器端加载太多。

什么是满足我需求的最佳方法:在Asp-Net、DotNetNuke模块中,显示数据来自SignalR,具有排序和分页功能,不会在回发时丢失数据?

您可以为使用内存缓存

对使用以下助手类

public static class CacheHelper<T>
{
    public static void AddCacheItem(string rawKey, object value)
    {
        CacheItemPolicy policy = new CacheItemPolicy();
        policy.SlidingExpiration = TimeSpan.FromMinutes(10);
        System.Runtime.Caching.MemoryCache.Default.Set(HttpContext.Current.Session.SessionID.ToString() + rawKey, value, policy);
    }
    public static T GetCacheItem(string rawKey)
    {
        return (T)MemoryCache.Default.Get(GetCacheKey(rawKey));
    }
}

然后访问您的数据表,如下所示,以获得缓存值

DataTable dt = CacheHelper<DataTable>.GetCacheItem("MyKey");

并遵循设定值

CacheHelper<DataTable>.AddCacheItem("MyKey",dt);

注意:您必须仔细设置缓存对象的CacheItemPolicy