0

我正在尝试动态添加一个 Web 用户控件,该控件包含一个 AJAX 可折叠面板,当用户单击一个按钮时,面板内有一个 Gridview。我可以添加用户控件的单个实例,但是当我添加其他用户控件时,它会引发以下错误:

说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.InvalidOperationException:扩展器控件可能未在 PreRender 之后注册。

源错误:

在执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪来识别有关异常起源和位置的信息。

我是 ASP.NET 开发的新手,我用来处理回发的方法是将用户控件存储在列表中,然后在 prerender 方法调用中再次添加它们。我不确定该怎么做,或者我是否正确处理用户控件的创建。任何建议表示赞赏。

这是后端代码:

public partial class Test : System.Web.UI.Page
{
    private IList<Control> _persistedControls;
    private const string PersistedControlsSessionKey = "thispage_persistedcontrols";

static int count = 1;
private IList<Control> PersistedControls()
{
    if (_persistedControls == null)
    {
        if (Session[PersistedControlsSessionKey] == null)
            Session[PersistedControlsSessionKey] = new List<Control>();
        _persistedControls = Session[PersistedControlsSessionKey] as IList<Control>;
    }
    return _persistedControls;
}

protected void Page_Load(object sender, EventArgs e)
{
    PersistedControls();
}

protected override void OnPreRender(EventArgs e)
{
    base.OnPreRender(e);
    IList<Control> controlsToGenerate = PersistedControls();

    // regenerate dynamically created controls
    foreach (var control in controlsToGenerate)
    {
        MasterPanel.Controls.Add(control);
    }
}

protected void Button1_Click(object sender, EventArgs e)
{
    Control control = LoadControl("~/WebUserControl/UseCaseSetupUserControl.ascx");
    control.ID = "uc" + count++.ToString();
    MasterPanel.Controls.Add(control);
    _persistedControls.Add(control);
    MasterPanel.Controls.Add(new LiteralControl("<br />"));
    _persistedControls.Add(new LiteralControl("<br />"));  
}

}

这是 ASPX 代码:

   <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Test.aspx.cs" Inherits="Test" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <asp:ScriptManager ID="ScriptManager1" runat="server">
    </asp:ScriptManager>
        <div>    
            <asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" />
            <br />
            <asp:Panel ID="MasterPanel" runat="server">
            </asp:Panel>    
        </div>
    </form>
</body>
</html>
4

1 回答 1

0

在页面生命周期中尽早创建控件。

由于您有PersistedControls负载,因此您应该将它们添加到控件集合中。添加控件的最佳位置Init

如果你真的不能这样做,那么使用Load.

如果这必须在事件上完成,那么您可以第一次在那里添加控件,但将其保留并记住从下一次回发开始将其重新添加到Init 或 Load上。

如果您在控件PreRender无法将任何数据添加到ViewState. SaveViewState 发生在PreRender. 许多控件严重依赖于ViewState正常运行。例外只是告诉您应该在页面生命周期的早期添加控件。

于 2012-08-10T18:23:31.840 回答