gpt4 book ai didi

c# - 如何避免通过 ViewState 为 ASP.NET 中的子控件保留数据?

转载 作者:行者123 更新时间:2023-11-30 18:44:45 25 4
gpt4 key购买 nike

我有一个控件(例如,DataGrid 或 ComboBox),它是用户控件的子控件。我想在每次请求时对其进行数据绑定(bind),而不是让它的状态通过 ViewState 保持不变。但是,我需要离开 EnableViewState=true。我认为这意味着我需要在调用 TrackViewState() 之前调用 DataBind。

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

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

最佳答案

斯科特,

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

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

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

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

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

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

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

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

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

关于c# - 如何避免通过 ViewState 为 ASP.NET 中的子控件保留数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2374679/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com