【问题标题】:Loading different controls in a Conditional UpdatePanel after Postback回发后在条件更新面板中加载不同的控件
【发布时间】:2011-08-04 09:01:42
【问题描述】:

我有这种格式的标记:-

 <asp:UpdatePanel runat="server" id="UpdatePanelList" UpdateMode="conditional">
     <ContentTemplate>   
         <asp:ListView></asp:ListView> 
     </ContentTemplate> 
 </asp:UpdatePanel>

 <asp:UpdatePanel runat="server" ID="UpdatePanelMain" UpdateMode="Conditional">
    <ContentTemplate />
 </asp:UpdatePanel> 

在此更新面板中,如果可以从数据库中找到记录,则应显示 DataGrid 控件(带有标签和下拉控件)。如果不是 HtmlGenericControl DIV 控件,则应显示相关消息,要求用户创建记录。这两个控件都是动态创建的,它们使用“输出”函数(如“ToString”)填充自定义构建的类。

如果我用几个连续的 DataGrid 控件填充 UpdatePanel 来测试操作,这可以正常工作。同样,HtmlGenericControl DIV 也会按预期多次连续填充。

但是,当我测试其他控件类型以填充 UpdatePanel 时,这在第一个实例上有效,但是填充 UpdatePanel 的任何其他回发都会失败,并且会出现一个对话框提示:

Failed to load viewstate.  The control tree into which viewstate is being 
loaded must match the control tree that was used to save viewstate during
the previous request.  For example, when adding controls dynamically, the 
controls added during a post-back must match the type and position of the 
controls added during the initial request.

我被引导相信 UpdatePanel 控件在此实例中控制了动态控件的视图状态。

如何恢复视图状态以允许多种类型的控件 显示在同一个 UpdatePanel 中?

谢谢。

【问题讨论】:

    标签: dynamic controls postback viewstate populate


    【解决方案1】:

    恢复所有动态控件(将执行此操作的信息保存到 ViewState,或任何确定的适当内容)以与生成最后一页相同的层次结构顺序在“Init”或“Load”生命周期事件中。这与 ASP.NET WebForms 中正常和异步回发的要求相同。

    控件必须添加 -- 以匹配控件层次结构 -- 并且然后在 "Load" 事件之后删除。

    参考:

    1. DynamicControlsPlaceholder,这是一个预先制作的控件来帮助解决这个问题。它还讨论了它的工作原理。
    2. Dynamic Loading of ASP NET User Controls

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-03
      • 1970-01-01
      • 2019-10-19
      • 1970-01-01
      • 1970-01-01
      • 2013-05-26
      相关资源
      最近更新 更多