【问题标题】:How to persist Asp Net GridView data (coming from SignalR) after page postback?如何在页面回发后保留 Asp Net GridView 数据(来自 SignalR)?
【发布时间】:2013-11-29 08:51:00
【问题描述】:

我在 DotNetNuke CMS 中创建模块。我不需要编辑我的数据,只需显示 带有排序和分页。有 asp:GridView 控件,其中有 DataTable 作为数据源。在 Page_Load 事件中,一些带有数据的行被添加到 dataTable 和 正确显示。排序和分页也可以。在 GridView 中维护数据 (并出于排序目的)使用 ViewState。我选择不使用 ViewState 服务器过载,传入的数据不一定是安全的。对于传入数据 我使用 SignalR,所以 javascript 函数从服务器(集线器)接收数据。 发现我将从 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,在回发时不会丢失数据?

【问题讨论】:

    标签: c# javascript asp.net signalr viewstate


    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-18
      • 2011-07-02
      • 2017-03-05
      • 1970-01-01
      • 1970-01-01
      • 2018-08-28
      • 2011-03-22
      相关资源
      最近更新 更多