繁体   English   中英

如何通过ViewState为ASP.NET中的子控件保留数据?

[英]How do I avoid persisting data through ViewState for a child control in ASP.NET?

我有一个控件(比如,一个DataGrid或一个ComboBox),它是用户控件的子代。 我想在每个请求上使用DataBind,而不是让它的状态通过ViewState持久化。 但是我需要保留EnableViewState=true 这意味着,我认为我需要在调用TrackViewState()之前调用DataBind。

我读了很棒的博客文章TRULY Understanding ViewState ,它回答了我的问题4. Initializing child controls programmatically 然而,文章的解决方案并不理想:动态创建子控件(我不是也不能 - 现有代码太多),使用第三方CodeExpressionBuilder(更喜欢这是代码隐藏),并使用OnPreInit(如果你正在开发一个CONTROL,它“对你不会有任何帮助”)。

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

斯科特,

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

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

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

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

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

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

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

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

如果您希望我对此更具体,请告诉我。 如果你想深入了解Nikhil Kothari关于开发控件的精彩书籍。 我想我把它看作某个电子书。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM