C# 动态控制寄存器请求控制状态

C# 动态控制寄存器请求控制状态,c#,asp.net,controls,C#,Asp.net,Controls,我使用我的web.config文件定义一个菜单,它工作正常。但为了改进系统,我想将创建的菜单控件存储在对象菜单中,以便在下次调用时重用它 如果我像在生成的版本中那样将菜单控件添加到母版页,则会出现RegisterRequestControlState错误: 无法在预呈现之前或之后调用RegisterRequiresControlState public class tabloidMenu : ConfigurationElementCollection { private Men

我使用我的web.config文件定义一个菜单,它工作正常。但为了改进系统,我想将创建的菜单控件存储在对象菜单中,以便在下次调用时重用它

如果我像在生成的版本中那样将菜单控件添加到母版页,则会出现RegisterRequestControlState错误:

无法在预呈现之前或之后调用RegisterRequiresControlState

    public class tabloidMenu : ConfigurationElementCollection
{
    private Menu menu_;

    static public explicit operator Menu(tabloidMenu configMenu)
    {
        if (configMenu.menu_ != null) return configMenu.menu_;

        Menu menu = new Menu();

        menu.CssClass = "menu";
        menu.EnableViewState = false;
        menu.ViewStateMode = System.Web.UI.ViewStateMode.Disabled;
        menu.IncludeStyleBlock = false;
        menu.Orientation = Orientation.Horizontal;


        if (tabloidConfigMenu.configMenu != null)
        {
            foreach (tabloidConfigMenuItem item in configMenu)
            {
                menu.Items.Add((MenuItem)item);
            }
        }

        configMenu.menu_=menu;

        return menu;
    }
在我的母版页中,我使用

protected void Page_Init(object sender, EventArgs e)
        {
            bool popupMode = Page.Request["mode"] == "popup";

            if (!popupMode)
            {
                System.Web.UI.HtmlControls.HtmlLink cssLink = new System.Web.UI.HtmlControls.HtmlLink();
                cssLink.Href = "~/Styles/Site.css";
                cssLink.Attributes.Add("rel", "stylesheet");
                cssLink.Attributes.Add("type", "text/css");
                Page.Header.Controls.Add(cssLink);

                //add menu

                if (Tabloid.tabloidConfigMenu.configMenu != null)
                {
                    Menu mn = (Menu)Tabloid.tabloidConfigMenu.configMenu.TopMenu;
                    mn.EnableViewState = false;
                    mn.ViewStateMode = System.Web.UI.ViewStateMode.Disabled;
                    Page.Master.FindControl("MenuHolder").Controls.Add(mn);
                }
                else
                {
                    Label l = new Label();
                    l.Text = Tabloid.tabloidConfigMenu.lastError;
                    Page.Master.FindControl("MenuHolder").Controls.Add(l);
                }
            }
你有什么想法吗


谢谢你的帮助

我想您已经回答了自己的问题,错误告诉您在prerender事件处理程序中加载控件。顺便说一句,如果你是在asp.net上工作,请标记它。我尝试了,但我有相同的反应。我选择使用page_init,但总是相同的错误?我不明白为什么在我使用菜单时行为会有所不同,你能在配置菜单后发布加载控件的代码吗;