为什么 ASP.NET Dynamic 控件即使添加到 Page_Load 中也能保留 ViewState?

2024-04-19

我做了一些与动态控件和 ViewState 相关的研究。

我读到,为了保留动态控件的 ViewState,您必须将其添加到 Page_Init 事件中。这是有道理的,因为 PageLifeCycle 是:

  1. 初始化。
  2. 加载视图状态。
  3. 加载回发数据。
  4. Load.
  5. 引发PostbackEvent。
  6. 保存视图状态。
  7. Render.

但我制作了一个测试应用程序,我发现即使我在 Page_Load 事件中而不是之后添加控件,ViewState 和属性值也会保留。从此我只找到了矛盾的信息。有人说控件可能会赶上 PageLifeCycle,另一些人说必须将它们添加到 Page_Init 中。有人可以帮我澄清一下吗?

我还在msdn中发现:

注意:您也许可以将控件加载到 Page_Load 事件处理程序并正确维护视图状态。它 一切都取决于您是否设置了任何属性 以编程方式动态加载控件,如果是这样,当您 相对于 Controls.Add(dynamicControl) 行执行此操作。彻底的 对此的讨论有点超出了本文的范围,但是 它可能起作用的原因是因为 Controls 属性的 Add() 方法 递归地将父级的视图状态加载到其子级中,甚至 尽管加载视图状态阶段已经过去。

但我不太明白这一点,所以我希望有人能解释一下。先感谢您。


此代码将在实际操作中演示它:

protected void Page_Load(object sender, EventArgs e)
{
    Button b1 = new Button();
    Button b2 = new Button();
    if (!IsPostBack)
    {
        b1.Text = "Button1";
    }
    this.form1.Controls.Add(b1);
    this.form1.Controls.Add(b2);
    if (!IsPostBack)
    {
        b2.Text = "Button2";
    }
}

因此,如果您在将控件添加到表单后对其进行修改,它将保留其视图状态,但如果您在将其添加到表单之前对其进行修改,则文本不会使其进入视图状态。这是what确实发生了why这就像是另一个问题(这实际上与我阅读文档时的想法相反)。

EDIT
我忘了提及 - 本质上,这是因为当通过 Controls.Add() 将控件添加到控件树时,控件会贯穿页面生命周期以“赶上”页面 - 关于此的文章有无数的文章,因为没有太多简单的事情。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 ASP.NET Dynamic 控件即使添加到 Page_Load 中也能保留 ViewState? 的相关文章

  • 是否可以强制 Visual Studio 2010 使用 Visual Basic 10?

    要重现我收到的错误 在 Visual Basic 中创建一个新的 Visual Studio 2010 ASP NET 网站 面向 NET 2 0 输入 公共财产测试作为字符串 请注意 Visual Basic 9 0 不支持自动实现的属性
  • 使用更新面板时服务器控件丢失其 CSS 样式

    我在用我的项目的模板 我在表单中使用了 updatepanel 在更新面板中我采用了 asp net 的不同下拉列表控件 现在的问题是 当页面回发时 应用于下拉列表的 css 样式会丢失 因为我对 CSS 没有详细的了解 所以请帮助 现在有
  • 如何在 Entity Framework Core 中调用标量函数

    下列的本文 http anthonygiretti com 2018 01 11 entity framework core 2 scalar function mapping 我试图使用 Entity Framework Core 将内部
  • 在 IIS 中托管时对 Web 服务的支持

    这是我的 ICloudCameraService cs OperationContract Reset account password default WebInvoke Method POST ResponseFormat WebMes
  • 如何在 .net 中为 Google 云存储签名 url

    我想知道如何使用 net中的谷歌云存储类生成signurl 我已经根据要求创建了字符串 GET 1388534400 bucket objectname 但我现在想用 p12 密钥签署这个 url 然后想让它变得 url 友好 该库没有显示
  • 发送到带有联系表格 asp.net 的电子邮件

    我如何使用 ASP NET 中的联系表单向指定的电子邮件地址发送电子邮件 该网站通过托管公司托管 谢谢 MailMessage mail new MailMessage SmtpClient SmtpServer new SmtpClien
  • ASP.NET 和 jQuery - 从代码隐藏调用

    这是我以前尝试过解决但放弃的问题 基本上我使用 ModalPopupExtenders 来自 AJAX NET 来显示带有一些内容 文本 控件等 的面板 我从代码隐藏中调用它 而且效果很好 但现在我想用一些 jQuery 对话框替换 Mod
  • SQL Server 2008 FileStream 与普通文件

    我正在创建一个像 youtube 这样的应用程序来存储视频 我需要一些建议 我应该使用 SQL Server FileStream 来存储视频文件 还是应该将它们存储在硬盘上的某个位置并将路径记录为 SQL Server 内的 varcha
  • Visual Studio Publish 的动态文件夹名称

    是否可以在 VS 2017 中配置文件系统发布选项 以根据日期或增量构建版本部署到新文件夹 即 当我单击发布时 我希望它转到 MyApp v1 然后下次单击 MyApp V2 您可以使用一些宏 要执行日期 请使用此宏 System Date
  • C# Asp.net Membership.GetAllUsers 通过电子邮件订购

    我正在使用 Membership GetAllUsers 来获取我的用户列表 我希望返回的列表按电子邮件地址排序 因为我需要标记一些具有重复电子邮件的帐户 Membership GetAllUsers 似乎默认按用户名排序 有办法改变这种行
  • ASP.NET 中的自定义角色

    我正在开发一个 ASP NET 网站 该网站使用带有自定义身份验证机制的表单身份验证 该机制设置e Authenticated以编程方式protected void Login Authenticate object sender Auth
  • 会话 ID 不够随机 - ASP.NET

    UPDATE 我们最终与 Acunetix 团队的一些程序员进行了会面 他们意识到他们的代码中可能存在一些错误 导致扫描中显示的问题比实际情况更严重 普遍的共识是忽略扫描结果并使用开箱即用的 ASP NET 会话 ID 生成 因为它对于我们
  • 如何构建 ImageButton 控件适配器(或者更一般地说,如何构建一个简单的控件适配器)?

    我对这个问题的灵感是我发现了非常烦人的默认样式 border width 0px 在 ImageButton Web 控件上 简单的解决方案是通过向控件添加您自己的样式来覆盖它 例如Style border width 2px 无论如何 如
  • ASP.NET 的电子邮件地址验证

    使用什么来验证 ASP NET 表单上的电子邮件地址 我想确保它不包含 XSS 漏洞 这是 ASP NET 1 1 ASP NET Web 表单上发布的任何脚本标记都会导致您的网站抛出未处理的异常 您可以使用 asp 正则表达式验证器来确认
  • 提高 ASP.NET/C# 编译速度的最佳方法是什么?

    更新 请将您的答案集中在硬件解决方案上 您使用什么硬件 工具 插件来提高 ASP NET 编译和首次执行速度 我们正在寻找固态硬盘来加快速度 但现在价格确实很高 我现在有两个 RAID 0 的 7200 rpm 硬盘 但我对性能不再满意 所
  • 使用 .NET Core Razor Pages 将文件下载到浏览器

    使用 ASP NET Razor Pages 我尝试将文件下载到浏览器 在页面 html 中 使用这样的链接效果很好 href DownloadableFiles testB csv download newname gt Download
  • FireFox 中的默认表单按钮

    我正在构建一个服务器控件 它将搜索我们的数据库并返回结果 服务器控件包含一个 ASP Panel 我已将面板上的默认按钮设置为等于我的按钮 id 并将表单默认按钮设置为等于我的按钮 id 在面板上 MyPanel DefaultButton
  • 使用 Asp.net 中的路由在 URL 中添加语言名称

    如何使用路由在 URL 中添加语言名称 我的网站运行于http localhost 41213 default aspxURL 成功 但该网站是多语言的 我的客户希望根据他想要的语言运行该网站http localhost 41213 en
  • 无法加载文件或程序集“App_Web_1btizmpz,

    我遇到以下错误 Could not load file or assembly App Web 1btizmpz Version 0 0 0 0 Culture neutral PublicKeyToken null or one of i
  • 如何以编程方式检测我的应用程序是否在 ASP.NET 页面中以 IIS 7.0 集成模式运行

    一般来说 我们应该控制我们的 AppPools 并能够强制使用托管管道模式 就我而言 我没有控制权 并且希望根据托管管道模式 集成与经典 以稍微不同的方式实现代码背后的代码 我只是不知道如何检测到这一点 有没有一种简单的方法可以从代码隐藏页

随机推荐