ASP.Net中动态内容的选项
在ASP.Net网站上创建有状态动态内容时,我有哪些选择?
这是我的情况。我有一个包含多个嵌套内容区域的网站。顶层是与功能区"目录","订阅","设置"相关联的动作。
当我们单击功能性操作时,我要动态添加特定于该操作的内容。例如,当单击"目录"时,我要显示带有目录文件夹和文件的树,并在右侧显示详细信息的区域。
当用户单击树时,我希望将上下文敏感的详细信息加载到详细信息区域(例如用于管理文件的属性或者选项)。
我从" UserControls"开始。只要我将所有内容始终加载到页面中,它们就可以正常工作,并且永远不会让任何一个消失。一消失,页面的" ViewState"就会爆炸,因为视图状态树无效。
(我不想继续将内容加载到页面中,因为我不希望响应太大)
因此,我的下一个方法是将动态区域替换为" IFrames"。然后,不用实例化" UserControl",我只需更改" IFrame"上的源即可。由于IFrames的内容是独立的页面,所以我没有遇到任何ViewState问题。
但是,我担心`IFrames'可能是一个糟糕的设计选择,但并不完全理解为什么。该网站不是公开的,因此不必担心搜索引擎。
所以,最后是我的问题。
在这种情况下,我有哪些选择?如果选择Ajax解决方案(jQuery),是否需要维护自己的ViewState?我还应该考虑其他因素吗?
解决方案
我们有许多不同的选择,是的,iframe是一个糟糕的设计选择。
第一种选择是AJAX解决方案。而且,实际上并没有一个viewstate场景,只是我们要与Web服务器来回传递数据,并根据需要动态构建UI。
下一个选项是每次动态地添加给定帖子所需的控件。它的工作方式是,在页面生命周期的开始,我们需要完全按照上次发送页面的顺序重建页面,然后转储所有不需要的控件,并只构建那些需要的控件。 。
第三种选择是使用母版页。顶级内容可以在母版页本身上,并具有指向网站内各个页面的链接。
我敢肯定,如果有足够的时间,我可以提出更多建议,但是这3项只是出于阅读问题而出现的。
动态添加的控件不会在viewstate中保留,这就是使用AJAX或者iframe或者其他无关紧要的原因。
一种可能的解决方法是在回发时重新填充控件。这个问题是页面生命周期(简化)为:
- 加载回发数据
- 呼叫控制加载事件
- 通话载入事件
- 通话控制事件
- 控制预渲染
- 预渲染
- SaveViewState
- 卸下
这意味着重新添加动态控件的唯一位置是Initialize-否则,发布的数据(或者视图状态信息)不会加载到该控件中。但是通常,由于Viewstat / postback数据在Initialize中尚不可用,因此代码没有所需的信息来确定需要添加哪些控件。
在这种情况下,我发现的唯一其他解决方法是使用名为DynamicControlsPlaceholder的第三方控件。这工作得很好,并且将控件信息保留在viewstate中。
在特定情况下,似乎没有太多选择/情况。仅在页面中具有所有不同的控件集,然后将它们放入asp:placeholder控件中,然后根据选择的内容将其设置为可见,是否可行?
其他一些选择:
- 内容似乎只是动态的。我们在页面上加载了足够的控件以处理任何内容,并且仅实际显示所需内容。这样可以避免麻烦的视图状态,但是这意味着页面具有更大的覆盖范围。
- 将控件动态添加到页面。我们已经在玩这个了,所以我们已经在这里看到了一些问题。只需记住,创建用于回发的动态控件的位置是在Page_Init()事件中,并且如果希望它们具有状态,则需要将该状态保持在某个位置。我推荐一个数据库。
如上所述,动态控件和视图状态不能很好地融合在一起,但这是一件好事,因为即使它们执行了复杂的动态页面的视图状态,也会变得肿,性能将降低到零
使用Ajax [我喜欢AJAX PRO,因为它使用起来非常简单],并自己管理页面状态[在会话,数据库表中,或者在适用于方案的任何情况下]。这样做会有些复杂,但是结果将是高效且响应迅速的:每个页面只能更新需要更改的内容,并且我们不会一直来回播放巨大的viewstate字符串