【发布时间】:2013-02-24 09:47:28
【问题描述】:
我有一个动态加载用户控件的 ASP.Net 页面,我想在它们之间共享一个数据表
我使用的会话状态如下
HttpContext.Current.Session["DataTable"] = DT;
并在用户控件中按以下方式访问它
gridVw.DataSource =(DataTable) HttpContext.Current.Session["DataTable"] ;
gridVw.DataBind();
数据已成功加载,但问题是在访问服务器端的任何事件或回发时,会引发无效视图状态的错误(仅在 IE 中)
在回发时从页面访问会话也会导致同样的问题
这是错误页面
此页面的状态信息无效,可能已损坏。 FormatException:输入不是有效的 Base-64 字符串,因为它 包含非 base 64 字符、两个以上的填充字符,或 填充字符中的非法字符。 ]
System.Convert.FromBase64_ComputeResultLength(Char* inputPtr, Int32 inputLength) +10545429 System.Convert.FromBase64CharPtr(Char* inputPtr, Int32 inputLength) +71
System.Convert.FromBase64String(String s) +41
System.Web.UI.ObjectStateFormatter.Deserialize(字符串输入字符串, 目的目的)+66
System.Web.UI.ObjectStateFormatter.System.Web.UI.IStateFormatter2.Deserialize(字符串 serializedState,目的用途)+8
System.Web.UI.Util.DeserializeWithAssert(IStateFormatter2 格式化程序, 字符串序列化状态,目的用途)+40
System.Web.UI.HiddenFieldPageStatePersister.Load() +127[ViewStateException:无效的视图状态。
我认为是因为会话有长数据或零分隔符或其他任何原因导致
System.Convert.FromBase64
我使用了另一个会话变量(虚拟数字)并从用户控件访问它以确保此用户控件没有问题并且没有问题
问题是我不想使用 Session 来保存我的数据表,因为我知道它的缺点,但还有其他建议吗?
注意:我正在以静态方法 (WebMethod) 在网页中加载用户控件,这使我无法采取任何可能的解决方法
【问题讨论】:
-
让我们分析一下,是否值得调用数据库来获取记录,而不是将整个数据表保存在会话状态中并从中检索相应的记录?! ,,我可以切换从数据库中获取我想要的记录来避免使用会话?
-
如何在 WebMethod 中动态加载 UserControl?它是如何添加到页面中的?请注意,我之所以问,是因为 ViewStateException 不应与您在会话中存储的内容相关,并且应该来自在 __VIEWSTATE 字段中发布到服务器的内容,除非已修改,否则它是基于之前保存到查看状态的内容请求页面。
标签: asp.net session user-controls postback viewstate