ASP.Net中动态内容的选项

时间:2008-09-24 01:19:36

标签: asp.net ajax iframe user-controls

我在ASP.Net网站上创建有状态动态内容有哪些选择?

这是我的情景。我有一个网站,有多个嵌套的内容区域。最高级别是与功能区域CatalogSubscriptionsSettings相关联的操作。

当您单击功能操作时,我想动态添加特定于该操作的内容。例如,单击目录时,我想显示一个带有目录文件夹&文件和右侧的区域以获取详细信息。

当用户点击树时,我希望在详细信息区域中加载上下文敏感的详细信息(例如管理文件的属性或选项)。


我从UserControls开始。只要我将所有内容都加载到页面中,它们就能正常工作,永远不会让它消失。一旦消失,页面的ViewState就会爆炸,因为视图状态树无效。

(我不想继续将内容加载到我的页面中,因为我不希望响应太大)

所以,我的下一个方法是用IFrames替换我的动态区域。然后,我只会更改UserControl上的来源,而不是实例化IFrame。由于IFrames的内容是独立页面,因此我没有遇到任何ViewState问题。

但是,我担心IFrames可能是一个糟糕的设计选择,但不完全理解为什么。该网站不公开,因此搜索引擎不是问题。


所以,最后是我的问题。

这种情况有哪些选择?如果我选择Ajax解决方案(jQuery),我是否必须维护自己的ViewState?我还应该考虑其他因素吗?

4 个答案:

答案 0 :(得分:2)

动态添加的控件不会在视图状态中保留,这就是使用AJAX或iframe或其他任何内容无关紧要的原因。

一种可能的解决方法是在回发时重新填充控件。这个问题,是页面生命周期(简化)是:

  1. 初始化
    • LoadViewState
    • 加载回发数据
    • 呼叫控制加载事件
    • 调用加载事件
    • 呼叫控制事件
    • 控制PreRender
    • 的PreRender
    • SaveViewState
    • 卸载
  2. 这意味着重新添加动态控件的唯一地方是Initialize - 否则发布的数据(或视图状态信息)不会加载到该控件中。但通常,由于Viewstat / postback数据在Initialize中尚不可用,因此您的代码没有确定需要添加哪些控件所需的信息。

    我在这种情况下发现的唯一其他解决方法是使用名为DynamicControlsPlaceholder的第三方控件。这非常有效,并且将控制信息保存在viewstate中。


    在您的特定情况下,似乎没有那么多选择/案例。在页面中拥有所有不同的控件集并将它们放在asp:占位符控件中,然后根据选择的内容将其设置为可见,这是否实用?

答案 1 :(得分:1)

你有很多不同的选择,是的,IFrame是一个糟糕的设计选择。

第一个选项是AJAX解决方案。而且这并不是一个真正的视图状态,只是你在网络服务器上来回传递数据,根据需要动态构建UI。

下一个选项是每次动态添加给定帖子所需的控件。它的工作方式是,在页面生命周期的开始,你需要完全按照上次发送的那样重建页面,然后转储所有不需要的控件,并构建那些想要的

第三种选择是使用母版页。您的顶级内容可以在主页面上,并且可以链接到网站中的各个页面。

我确信有足够的时间,我可以拿出更多,但这3个只是从阅读你的问题出现。

答案 2 :(得分:1)

其他一些选择:

  1. 内容是动态的。您在页面上加载了足够的控件来处理任何事情,并且只实际显示您需要的内容。这样可以节省很多视线状态等麻烦,但这意味着您的页面占用空间更大。
  2. 动态地向页面添加控件。你已经玩过这个了,所以你在这里看到了一些问题。请记住,为回发创建动态控件的位置在Page_Init()事件中,如果您希望它们是有状态的,则需要将该状态保持在某个位置。我推荐一个数据库。

答案 3 :(得分:1)

动态控件和viewstate不能很好地混合,如上所述 - 但这是一件好事,因为即使他们为复杂的动态页面做了视图状态也会变得臃肿,性能会降低到零

使用Ajax [我喜欢AJAX PRO,因为它使用起来非常简单]并自己管理页面状态[在会话,数据库表或适用于您的场景的任何内容]。开始这将会有点复杂,但结果将是高效和响应的:每个页面只能更新需要更改的内容,并且您不会一直来回吹出巨大的viewstate字符串