3

我有一个控件(比如 DataGrid 或 ComboBox),它是用户控件的子控件。我想在每个请求上对它进行 DataBind,而不是让它的状态通过 ViewState 持续存在。然而我需要离开EnableViewState=true。我认为,这意味着我需要在调用 TrackViewState() 之前调用 DataBind。

我阅读了精彩的博客文章TRULY Understanding ViewState,它回答了我的问题4. Initializing child controls programmatically。然而,这篇文章的解决方案不太理想:动态创建子控件(我不是也不能——现有代码太多),使用第 3 方 CodeExpressionBuilder(更希望这是在代码隐藏中),并使用 OnPreInit (“如果您正在开发 CONTROL,它对您没有任何帮助”)。

由于那篇文章相当陈旧(大约 2006 年),我希望新版本的 ASP.NET 能够纠正这种情况,以便现在有更好的解决方案。那么,社区,有什么好的方法可以做到这一点吗?

4

1 回答 1

0

斯科特,

我认为对 ASP.NET Web 窗体框架的工作方式存在误解。所以先说一点理论。

ASP.NET Web 窗体页面具有设计和代码隐藏文件。设计文件具有 HTML 标记和“控件”,它们是对用户或自定义控件的引用标记。每个具有属性的元素runat = "server"都是服务器控件(这意味着可以从其 ID 后面的代码中访问它)。

当在浏览器中打开页面时,ASP.NET 获取设计文件并处理这些控件引用并最终生成纯 HTML。

ViewState 是 HTML 中的一个隐藏变量,它保持所有被标记runat = "server"并且属性 EnableViewState 设置为 True 的控件的内部状态。

假设您有带有EnableViewState = False. 此网格具有包含服务器控件的行,并且您希望它们处于 ViewState 中。您仍然可以让它们拥有EnableViewState = True并处于 ViewState 中,并且您仍然可以绑定到这些子控件的事件。

因此,即使 DataGrid 不在 ViewState 中,它的子节点也可以在 ViewState 中,并且您可以处理适当的事件。

如果您希望它在每次回发后显示数据,则每次都需要在 PageLoad 事件中初始化 DataGrid。

ViewState 保持内部控制状态,因此您不能在 ViewState 中拥有某些控件属性,而在 ViewState 中没有其他属性。但是即使父控件不在 ViewState 中,您也可以让子控件(它们不是属性,它们是子实体!)处于 ViewState 中。

如果您想让我更具体地说明这一点,请告诉我。如果你想深入了解,Nikhil Kothari 有一本关于开发控件的精彩书籍。我想我在某处看到它作为电子书。

于 2010-03-04T20:04:55.333 回答