我有一个动态加载用户控件的ASP.Net页面,我想在它们之间共享一个数据表
我已将会话状态用作以下
HttpContext.Current.Session["DataTable"] = DT;
并在用户控件中将其访问为以下内容
gridVw.DataSource =(DataTable) HttpContext.Current.Session["DataTable"] ;
gridVw.DataBind();
数据加载成功但问题是在访问服务器端的任何事件或回发时会引发无效视图状态的错误(仅在IE中)
同时从页面访问会话会在回发时导致同样的问题
这是错误页面
此页面的状态信息无效,可能已损坏。 FormatException:输入不是有效的Base-64字符串 包含一个非基础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(String inputString, 用途目的)+66
System.Web.UI.ObjectStateFormatter.System.Web.UI.IStateFormatter2.Deserialize(字符串 serializedState,目的用途)+8
System.Web.UI.Util.DeserializeWithAssert(IStateFormatter2 formatter, String serializedState,目的用途)+40
System.Web.UI.HiddenFieldPageStatePersister.Load()+127[ViewStateException:viewstate无效。
我认为这是因为会话有长数据或零分隔符或导致
的任何原因System.Convert.FromBase64
我使用了另一个会话变量(虚拟号码)并从用户控件访问它以确保此用户控件没有问题并且没有问题
问题是我不想使用Session来保存我的数据库,因为我知道它的缺点但是还有其他建议吗?
注意:我正在以静态方法(WebMethod
)在网页中加载用户控件,这阻止了我做任何可能的解决方法
答案 0 :(得分: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)