【问题标题】:share a datatable between asp.net page and user control在 asp.net 页面和用户控件之间共享数据表
【发布时间】: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


【解决方案1】:

您根本不需要使用会话变量。如果将用户控件的公共函数(或属性)公开给 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)

【讨论】:

  • 谢谢 4 你的回答,我知道,但问题是我当时没有数据表,所以检索后我将它保存在会话中以供进一步使用..在我的帖子中我已经说问题也是在网页本身访问session
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-20
  • 1970-01-01
  • 2010-12-13
相关资源
最近更新 更多