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

时间:2013-11-29 08:51:00

标签: c# javascript asp.net signalr viewstate

我在DotNetNuke CMS中创建模块。我没有必要编辑我的数据,只需显示 与排序和分页。有asp:GridView控件,它有DataTable 作为数据源。在Page_Load事件中,一些带有数据的行被添加到dataTable和 正确显示。排序和打包工作也可以。在GridView中维护数据 (以及用于排序目的)使用ViewState。我选择不使用ViewState 服务器过载,传入的数据不必是安全的。对于传入的数据 我使用SignalR,因此javascript函数从服务器(集线器)接收数据。 想通了我将从javascript web方法(C#)AddNewRowToDataTable调用 (DateTime time,string name,double value ...)将参数传递给方法。 不幸的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的排序和分页功能,不会丢失回发数据吗?

1 个答案:

答案 0 :(得分:1)

您可以使用内存缓存

使用以下帮助程序类

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