代码之家  ›  专栏  ›  技术社区  ›  Jay Mooney

ASP中动态内容的选项。网

  •  1
  • Jay Mooney  · 技术社区  · 17 年前

    在ASP中创建有状态的动态内容,我有什么选择。网络网站?

    这是我的场景。我有一个有多个嵌套内容区域的网站。顶层是与职能领域相关的行动 Catalog , Subscriptions , Settings .

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

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


    我从 UserControls 。只要我一直把所有内容都加载到页面中,并且从不让任何内容消失,它们就工作得很好。一旦其中一个消失了, ViewState 由于视图状态树无效,页面崩溃。

    (我不想一直把东西加载到我的页面上,因为我不想让回复太大)

    所以,我的下一个方法是用以下内容替换我的动态区域 IFrames 然后,与其实例化 UserControl ,我只会在我的 IFrame .由于 内嵌框架 是独立的页面,我没有遇到任何 对象 问题。

    但是,我担心 内嵌框架 这可能是一个糟糕的设计选择,但并不完全理解原因。该网站不是公开的,所以搜索引擎不是问题。


    最后,回答我的问题。

    对于这种情况,我有什么选择?如果我选择Ajax解决方案(jQuery),我必须维护自己的ViewState吗?还有其他需要我考虑的因素吗?

    4 回复  |  直到 10 年前
        1
  •  2
  •   gregmac    17 年前

    动态添加的控件不会持久存在于viewstate中,这就是为什么使用AJAX或iframe或其他什么都没关系的原因。

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

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

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

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


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

        2
  •  1
  •   Stephen Wrighton    17 年前

    其他一些选择:

    1. 仅限内容 出现 要有活力。你在页面上加载了足够的控件来处理任何事情,而且实际上 显示 你需要什么。这省去了很多弄乱视图状态等的麻烦,但意味着你的页面占用了更大的空间。
    2. 动态地向页面添加控件。你已经在玩这个了,所以你已经看到了这里的一些问题。只需记住,为回发创建动态控件的位置在Page_Init()事件中,如果你想让它们有状态,你需要把它保存在某个地方。我推荐一个数据库。
        3
  •  1
  •   Joel Coehoorn    17 年前

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

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

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

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

    我相信,如果时间足够,我可以想出更多,但这3个问题只是从阅读你的问题中出现的。

        4
  •  1
  •   Steven A. Lowe    17 年前

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

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