2

我有一个动态加载用户控件的 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。反序列化(字符串输入字符串,目的目的)+66
System.Web.UI.ObjectStateFormatter.System.Web.UI.IStateFormatter2.Deserialize(字符串序列化状态,目的目的)+8
System.Web.UI.Util.DeserializeWithAssert(IStateFormatter2 格式化程序,字符串序列化状态,目的用途) +40
System.Web.UI.HiddenFieldPageStatePersister.Load() +127

[ViewStateException:无效的视图状态。

我认为这是因为会话有长数据或零分隔符或其他任何原因导致

System.Convert.FromBase64

我使用了另一个会话变量(虚拟数字)并从用户控件访问它以确保此用户控件没有问题并且没有问题

问题是我不想使用 Session 来保存我的数据表,因为我知道它的缺点,但还有其他建议吗? 注意:我正在以静态方法()在网页中加载用户控件,WebMethod这使我无法采取任何可能的解决方法

4

1 回答 1

0

您根本不需要使用会话变量。如果将用户控件的公共函数(或属性)公开给 Web 应用程序,则可以将表分配给控件。例子:

Partial Class user_controls_myControl
    Inherits System.Web.UI.UserControl
   'create a public method your app can see:

   Public Sub bindData(ByVal dt As dataTable)
   End Sub

End Class 

然后,您可以像这样从您的主应用程序访问它:

dim mydataTable as dataTable
'fill the datatable
dim myControl as myControl1
myControl.bindData(mydataTable)
于 2013-03-08T18:47:17.443 回答