1

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

这是我的场景。我有一个具有多个嵌套内容区域的站点。顶层是与功能区域CatalogSubscriptions、相关联的操作Settings

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

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


我从UserControls. 只要我不断将所有内容加载到页面中,它们就可以正常工作,并且永远不要让任何内容消失。一个消失后,ViewState页面就炸了,因为视图状态树无效。

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

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

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


所以,最后回答我的问题。

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

4

4 回答 4

2

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

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

  1. 初始化
    • 加载视图状态
    • 加载回发数据
    • 呼叫控制加载事件
    • 调用加载事件
    • 呼叫控制事件
    • 控制预渲染
    • 预渲染
    • 保存视图状态
    • 卸下

这意味着重新添加动态控件的唯一地方是初始化——否则发布的数据(或视图状态信息)不会加载到该控件中。但通常,由于在 Initialize 中还没有 Viewstat/postback 数据,您的代码没有确定需要添加哪些控件所需的信息。

在这种情况下,我发现的唯一其他解决方法是使用名为DynamicControlsPlaceholder的第 3 方控件。这工作得很好,并将控制信息保留在视图状态中。


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

于 2008-09-24T02:06:10.140 回答
1

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

第一个选项是 AJAX 解决方案。这样就没有真正的视图状态场景,只是你在网络服务器来回传递数据,根据需要动态构建 UI。

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

第三种选择是使用母版页。您的顶级内容可能位于母版页本身,并具有指向网站内各个页面的链接。

我肯定给了足够的时间,我可以想出更多,但这三个只是从阅读你的问题中出现的。

于 2008-09-24T01:30:24.347 回答
1

其他一些选项:

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

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

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

于 2008-09-24T04:37:13.773 回答