收集被修改;枚举操作可能无法执行

时间:2011-06-02 01:22:03

标签: c# asp.net

我在生产ASP.Net应用程序中不断收到以下警告(而不是错误):

System.Web.HttpUnhandledException: Exception of type 'System.Web.HttpUnhandledException' was thrown. ---> System.InvalidOperationException: Collection was modified; enumeration operation may not execute.
at System.Web.UI.ControlCollection.ControlCollectionEnumerator.MoveNext()
at System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children)
at System.Web.UI.HtmlControls.HtmlForm.RenderChildren(HtmlTextWriter writer)
at System.Web.UI.HtmlControls.HtmlForm.Render(HtmlTextWriter output)
at System.Web.UI.HtmlControls.HtmlForm.RenderControl(HtmlTextWriter writer)
at System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children)
at DMAC.UI.Master.Render(HtmlTextWriter writer)
at System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children)
at System.Web.UI.Page.Render(HtmlTextWriter writer)
at Telerik.Web.UI.RadAjaxControl.RenderPageInAjaxMode(HtmlTextWriter writer, Control page)
at System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children)
at System.Web.UI.Page.Render(HtmlTextWriter writer)
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
--- End of inner exception stack trace ---
at System.Web.UI.Page.HandleError(Exception e)
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
at System.Web.UI.Page.ProcessRequest(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
at System.Web.UI.Page.ProcessRequest()
at System.Web.UI.Page.ProcessRequest(HttpContext context)
at ASP.scan_history_aspx.ProcessRequest(HttpContext context)
at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

以下是发生错误的Render方法的代码:

protected override void Render(HtmlTextWriter writer)
    {
        Header header = new Header();
        List<Menu> menus = DMAC.Application.Current().Menus;
        Menu menu = menus.Find(m => m.MenuId == MenuId);

        SiteMapWindow siteWindow = new SiteMapWindow();
        siteWindow.OpenerId = Menu.PATHID;
        this.Page.Form.Controls.Add(siteWindow);

        SupportWindow supportWindow = new SupportWindow();
        supportWindow.OpenerId = Menu.SUPPORTID;
        this.Page.Form.Controls.Add(supportWindow);

        this.Page.Form.Controls.AddAt(0, menu);
        this.Page.Form.Controls.AddAt(0, header);

        Scripts.GoogleAnalytics.RegisterScript(this.Page);
        base.Render(writer);
    }

我无法自己重新创建错误。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我怀疑在Render

中添加(非子)控件会产生问题

也就是说,控件被添加到页面控件集合中,这可能会被迭代以渲染子节点。(我假设包含此代码;在子控件中。)

将布局修改(实际上,方法中的所有内容)移动到CreateChildControls或适当的地方。 (我不确定CreateChildControls在这里确实没问题 - 我相信这个问题是Page Controls 不是孩子。)

快乐的编码。