ASP 生命周期、InnerHtml 和动态控件

Posted

技术标签:

【中文标题】ASP 生命周期、InnerHtml 和动态控件【英文标题】:ASP Life-Cycle, InnerHtml and Dynamic Controls 【发布时间】:2013-07-22 12:35:40 【问题描述】:

首先 - 如果您想要问题的简短版本,请向下滚动直到看到 QUESTION:

好吧,在过去一年左右的时间里,我遇到了很多关于动态控件的各种场景的问题 - 也就是说,通过 javascript 或 C# 以编程方式创建的控件然后添加到 aspx 页面。在我的工作地点添加动态控件的一种看似最喜欢的方式似乎是以下几种变体:-

ASPX

<div id='divExample'>

JavaScript

document.getElementById('divExample').innerhtml = "some random html code and controls here"

现在,在过去的一年里,我们还推动将我们的 Web 应用程序从仅 IE 转变为跨浏览器兼容 - 重点是让 Safari 启动和运行......并且出现了很多与此相关的问题到动态控件。我的高级开发人员坚持认为,没有必要对给我们带来问题的动态控件的呈现方式进行重大重新编码......

当然,经过一些研究,我得到了 ASP 生命周期的基本信息,并且动态控件需要在每次回发时重新创建 - 我相信 - 在 Page_Load 方法执行之前。因此,我通过一些相当费力的控制重新编码解决了大部分问题 - 将初始化移至 Page_PreLoad 方法并将大量 JavaScript“innerHTML = 'some string of plain html etc'”渲染更改为基于 C# 对象的初始化。

现在,无论我的某些事实是否有误,我都知道这已经奏效并解决了我的问题。现在这篇文章的症结是我一直在尝试来得到解决这个问题的确切实际原因,我相信这与渲染元素的 innerHTML 的排序有关,但没有多少搜索能够告诉我这将在 ASP 页面生命周期中确切发生的时间。我的学长会再次问为什么有必要我毫不怀疑 - 尽管不用说他所有的想法都没有奏效......

...

好吧,对不起华夫饼,简而言之:-

问题: 在 ASP 生命周期中的哪个时间点呈现元素的 innerHTML,这对于附加到以这种方式呈现的控件的事件有什么后果 - 处理这种情况的正确方法是什么?

感谢您的阅读。

【问题讨论】:

迁移到 .NET MVC,你会更开心,而且从 web 开发的角​​度来看它更有意义。 “常规” .NET 试图将桌面开发范式展示为 Web 开发,这会产生太多令人困惑的不必要抽象层。 【参考方案1】:

javascript innerHtml 属性将在 ASP.net 生命周期完成后呈现,就像它发生在服务器端一样。因此,它不会影响生命周期内的 C# 代码。

关于回发,将回发视为一个全新的请求 - 在所有服务器端事件完成后,您的控件将需要重新生成。

【讨论】:

好的 - 这很有意义,听起来很可靠,并且验证了我已经想到的(澄清)。如果它在生命周期完成之后发生,那么事件就不会被连接起来......现在我想,这些问题中的大部分都出现在从 asp -> aspx 转换/升级的页面上......猜测两者之间存在一些生命周期差异,这就是它们之前工作的原因....感谢 Max 的输入! @BaronvonConnor 没问题。作为补充说明,您可能不希望将 JS 中动态生成的元素本身视为“控件”,而更多地视为静态 HTML。不过,听起来您实际上可能希望使用在页面生命周期内动态生成的控件,因此msdn.microsoft.com/en-us/library/c0az2h86(v=vs.100).aspx 是一个很好的起点。 根据您的页面的复杂性(例如中继器),可能对我之前评论中示例的更通用方法有额外的要求。这个***.com/questions/128083/… 解决了解决此类问题的几种好方法。 当谈到实际动态地制作控件时,我现在已经很好地掌握了这一点。然而,我们有一些“遗留控件”,它们既丑陋又笨重,我们基本上试图通过尽可能少的工作来实现跨浏览器。出于某种原因,我的高级开发人员想要保留旧的东西,而不是升级到像 Telerik datepicker 这样方便的小东西(即使 Telerick 控件已经在整个系统中使用)。大多数情况下,这种方法比简单的升级要花费更多的时间,但是......你能做什么?

以上是关于ASP 生命周期、InnerHtml 和动态控件的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET 页生命周期概述1

ASP.NET最常用的页面生命周期事件

为啥ASP.net中动态控件在刷新后不能

从 InnerHTML 中的代码隐藏向页面添加 ASP 控件

ASP.NET页面生命周期包括哪几个阶段

asp.net MVC 应用程序的生命周期