[英]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.