ASP.Net中动态内容的选项

时间:2020-03-06 14:38:13  来源:igfitidea点击:

在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字符串