我如何确定哪个ASP控件抛出异常?

时间:2010-10-09 04:15:18

标签: asp.net

我在渲染过程中从ASP页面获得以下异常:

不能在DropDownList中选择多个项目。

at System.Web.UI.WebControls.DropDownList.VerifyMultiSelect()    在System.Web.UI.WebControls.ListControl.RenderContents(HtmlTextWriter writer)    在System.Web.UI.WebControls.WebControl.Render(HtmlTextWriter writer)    在System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer,ControlAdapter adapter)    在System.Web.UI.Control.RenderControl(HtmlTextWriter编写器,ControlAdapter适配器)    在System.Web.UI.Control.RenderControl(HtmlTextWriter writer)    在System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer,ICollection children)    在System.Web.UI.Control.RenderChildren(HtmlTextWriter writer)    在System.Web.UI.HtmlControls.HtmlForm.RenderChildren(HtmlTextWriter编写器)    在System.Web.UI.HtmlControls.HtmlContainerControl.Render(HtmlTextWriter writer)    在System.Web.UI.HtmlControls.HtmlForm.Render(HtmlTextWriter输出)    在System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer,ControlAdapter adapter)    在System.Web.UI.Control.RenderControl(HtmlTextWriter编写器,ControlAdapter适配器)    在System.Web.UI.Control.RenderControl(HtmlTextWriter writer)    在System.Web.UI.HtmlControls.HtmlForm.RenderControl(HtmlTextWriter writer)    在System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer,ICollection children)    在System.Web.UI.Control.RenderChildren(HtmlTextWriter writer)    在System.Web.UI.Control.Render(HtmlTextWriter编写器)    在System.Web.UI.Page.Render(HtmlTextWriter编写器)    在System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer,ControlAdapter adapter)    在System.Web.UI.Control.RenderControl(HtmlTextWriter编写器,ControlAdapter适配器)    在System.Web.UI.Control.RenderControl(HtmlTextWriter writer)    在System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint,Boolean includeStagesAfterAsyncPoint)

我的代码都不在堆栈跟踪中,我的页面上有七个下拉列表。我根据来自多个数据库表的数据以及有关默认选择的规则,在我的代码中的下拉列表中设置选定的行。所以我很可能有一个错误,我在其中一个字段上设置了所选项目。但是,如何判断哪个字段导致问题?

在Global.asax我有

    void Application_Error(object sender, EventArgs e) 
    {
        // Code that runs when an unhandled error occurs
        Exception lastException = Server.GetLastError();
    }

我可以设置一个断点,但异常中没有任何内容似乎告诉我在抛出异常时正在渲染哪个字段。

有关何处可以找到此信息或调试策略的任何提示都可以帮助我找到它?

4 个答案:

答案 0 :(得分:1)

使用Ctrl + Alt + E选项启动异常对话框,然后在“Common Language Runtime Exceptions”行中选择“Thrown”复选框。附加工作进程,它将直接将您带到导致问题的行。

答案 1 :(得分:1)

我必须做的是检查预渲染中的所有下拉控件,以找出导致问题的那些控件。一旦我发现我能够在导致问题的哪个字段中找到并发现我的错误。导致该错误是因为在下拉列表中设置列表项的Selected属性不会取消选择其他项,但设置DropDownList的SelectedItem或SelectedIndex属性会取消选择以前选择的项。

由于这是我的代码,我可以在调试器找到两个项目时停止它。使用quickView,您可以检查字段ddl.SelectedIndicesInternal.Count,这是一个受保护的字段,它将直接告诉您(需要循环)选择了多少(以及哪些,如果您查看数组)元素。不幸的是,这是一个受保护的字段,如果没有绕过保护级别,我的代码就无法检查它。

答案 2 :(得分:1)

希望对其他类似bug的人有用,以下是我用来检查所选项目的代码:

        protected override void OnPreRenderComplete(EventArgs e)
        {
            base.OnPreRender(e); if (IsPostBack) return;

            // check that only one element is selected in a dropdown list
            DropDownList[] ddls = { ddl_0, ddl_1, ddl_2, ddl_3, ddl_4, ddl_5};
            foreach(DropDownList ddl in ddls)
            {
                // loop over all the list items in the drop down
                Boolean oneSelected = false;
                foreach (ListItem itm in ddl.Items)
                {
                    if (itm.Selected && !oneSelected)
                    {
                        oneSelected = true;
                    } else if (itm.Selected)
                        // should never happen
                        throw new Exception(String.Format(
                            "Multiple values in DropDownList");
                }
            }
        }

答案 3 :(得分:1)

你的代码给了我很多帮助。我现在已经确定了哪个DDL是我自己代码中的罪魁祸首。

我对你的代码采取了一些自由,这是我的版本:

protected List<Control> RecursivelyFindAllDropDownLists(
    Control parent, List<Control>listDropDowns
    )
{
    foreach (Control c in parent.Controls)
    {
        if (c == null || !(c is Control) )
            continue;
        else if (c is DropDownList)
            listDropDowns.Add(c);
        else
            RecursivelyFindAllDropDownLists(c, listDropDowns);
    }
    return listDropDowns;
}
protected void Page_PreRender(object sender, EventArgs e)
{
    List<Control> ddls = new List<Control>();
    RecursivelyFindAllDropDownLists(this, ddls);  // find ddls automatically.  
    foreach(DropDownList ddl in ddls)
    {
        Boolean oneSelected = false;

        // loop over all the list items in the drop down
        foreach (ListItem itm in ddl.Items)
        {
            if (itm.Selected && !oneSelected)
                oneSelected = true;
            else if (itm.Selected) // should never happen
                throw new Exception(String.Format(
                    "Multiple values in DropDownList: " + ddl.ID
                    ));
        }
    }
}

再次感谢您与我们其他人分享您的斗争!