我在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的排序和分页功能,不会丢失回发数据吗?
答案 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