Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何避免通过ASP.NET中的子控件的ViewState持久化数据?_C#_Asp.net_Viewstate_Onload_Onpreinit - Fatal编程技术网

C# 如何避免通过ASP.NET中的子控件的ViewState持久化数据?

C# 如何避免通过ASP.NET中的子控件的ViewState持久化数据?,c#,asp.net,viewstate,onload,onpreinit,C#,Asp.net,Viewstate,Onload,Onpreinit,我有一个控件(比如DataGrid或ComboBox),它是用户控件的子控件。我希望在每个请求上对其进行数据绑定,而不是通过ViewState将其状态持久化。但是,我需要离开EnableViewState=true。这意味着,我想,我需要在调用TrackViewState()之前调用DataBind 我读了这篇精彩的博文,它回答了我在4中的问题。以编程方式初始化子控件。然而,本文的解决方案并不理想:动态创建子控件(我不是也不能——太多现有代码),使用第三方CodeExpressionBuilde

我有一个控件(比如DataGrid或ComboBox),它是用户控件的子控件。我希望在每个请求上对其进行数据绑定,而不是通过ViewState将其状态持久化。但是,我需要离开
EnableViewState=true
。这意味着,我想,我需要在调用TrackViewState()之前调用DataBind

我读了这篇精彩的博文,它回答了我在
4中的问题。以编程方式初始化子控件
。然而,本文的解决方案并不理想:动态创建子控件(我不是也不能——太多现有代码),使用第三方CodeExpressionBuilder(更希望它是在代码隐藏中),以及使用OnPreInit(如果您正在开发一个控件,它“无论如何都不会帮助您”)

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

我认为对ASP.NETWebForms框架的工作原理存在误解。所以先来点理论

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

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

ViewState是HTML中的一个隐藏变量,它保留所有标记为
runat=“server”
的控件的内部状态,并将属性EnableViewState设置为True

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

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

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

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


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

自定义控件不支持类似.aspx文件的用户控件,因此必须以编程方式添加子控件。你确定这里说的是自定义控件吗?是的,除非我的语义混淆了。自定义控件与用户控件不同吗?我有一个使用.ascx的.aspx。.ascx声明性地使用一个数据网格和一个组合框,我希望在不将数据持久化到ViewState的情况下对它们进行数据绑定。是的,自定义控件和用户控件是不同的。ASCX文件表示您拥有用户控制权。为什么需要保持EnableViewState=true?您只需将其设置为false和in Page。加载添加行以初始化数据源并执行数据绑定。@vitaly-我想您指的是“服务器”控件和用户控件之间的区别?服务器控件不支持.ascx标记文件,而用户控件则支持。@Vitaly:谢谢,我更正了主要帖子,但我不确定我是否完全理解其中的区别。我试图查找它,并以“用户控件是自定义的、可重用的控件…”开头。谢谢您对ViewState进行了很好的总结,但我不相信它回答了我的问题。如果你还没有读过我提到的那篇文章,特别是我提到的那一节,我想你会明白我的意思。斯科特,你能告诉我在我解释之后你还有什么问题吗?