2010-10-09 34 views
2

在渲染过程中,我从ASP页获取以下例外:如何找出哪个ASP控件抛出异常?

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

在System.Web.UI.WebControls.DropDownList.VerifyMultiSelect() 在System.Web.UI.WebControls.ListControl.RenderContents(HtmlTextWriter的作家) 在System.Web.UI.WebControls.WebControl.Render(HtmlTextWriter的作家) 在System.Web.UI.Control.RenderControlInternal(HtmlTextWriter的作家的ControlAdapter适配器) 在System.Web.UI.Control.RenderControl(HtmlTextWriter的作家的ControlAdapter适配器) 在System.Web.UI.Control.RenderControl( HtmlTextWriter writer) at System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer,ICollection children) at System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) at System.Web .UI.HtmlControls.HtmlForm.RenderChildren(HtmlTextWriter writer) at System.Web.UI.HtmlControls.HtmlContainerControl.Render(HtmlTextWriter writer) at System.Web.UI.HtmlControls.HtmlForm.Render(HtmlTextWriter output) at System。 Web.UI.Control.RenderControlInternal(HtmlTextWriter编写器,ControlAdapter适配器) at System.Web.UI.Control.RenderControl(HtmlTextWriter writer,ControlAdapter adapter) at System.Web.UI.Control.RenderControl(HtmlTextWriter writer) at System .Web.UI.HtmlControls.HtmlForm.RenderControl(HtmlTextWriter的作家) 在System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter的作家,ICollection的孩子) 在System.Web.UI.Control.RenderChildren(HtmlTextWriter的作家) 在系统.Web.UI.Control .Render(HtmlTextWriter writer) at System.Web.UI.Page.Render(HtmlTextWriter writer) at System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer,ControlAdapter adapter) at System.Web.UI.Control.RenderControl (HtmlTextWriter的作家的ControlAdapter适配器) 在System.Web.UI.Control.RenderControl(HtmlTextWriter的作家) 在System.Web.UI.Page.ProcessRequestMain(布尔includeStagesBeforeAsyncPoint,布尔includeStagesAfterAsyncPoint)

无我的代码是堆栈跟踪和我的页面上有七个下拉列表。我将基于来自多个数据库表的数据以及有关默认选择的规则,在我的代码中的下拉列表上设置选定的行。所以这是很有可能我有一个错误,我在我的领域之一设置选定的项目。但是,我怎么知道哪个字段导致了这个问题呢?

在Global.asax中我有

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

对此我能上,但是没有什么异常,似乎告诉我哪场当异常抛出得到了渲染设置一个断点。

任何提示哪里可以找到这些信息或调试策略,这将帮助我找到它?

+0

当然,我试过调试。创建页面的编译阶段将突破并突出显示该行,但一旦它进入呈现控件,它不会这样做。 – verisimilidude 2010-10-09 04:51:33

+0

我只是自己有这个问题。谢谢你提出这个问题,并且比我做得更好! – 2014-07-17 18:42:10

+0

@Marko如果您知道有关此异常的任何信息,则可以在稍后的渲染阶段进行验证。你为什么不看看提供的堆栈跟踪?这没有告诉你在有问题的对象的函数调用期间没有发生错误? – 2014-07-17 18:43:48

回答

1

使用Ctrl + Alt + E选项启动异常对话框,在“公共语言运行时异常”行上选择“Thrown”复选框。附加工作进程,它会直接带您到导致问题的线路。

+0

这适用于我的代码引发的异常,但这里的异常是由框架(我假设)在没有调试支持的情况下编译的。在这种情况下,调试器不会中断。 – verisimilidude 2010-10-09 04:47:53

+0

另一种选择是逐个评论每个下拉列表的代码,然后查看哪部分代码导致了问题。这是费时的,但如果调试没有帮助,猜测是唯一的方法。 – Pradeep 2010-10-09 05:07:18

+0

在发生错误的验证逻辑中查找行很简单。困难在于这样一个事实,即异常并没有告诉我们哪个控件正在被验证(它们都是在某种类型的循环中自动运行的)。另外,函数调用所请求的验证来得比请求本身晚得多。 – 2014-07-17 18:47:29

1

我所要做的就是检查预渲染中的所有下拉控件,找出造成问题的哪些位置。一旦我发现我能够在导致问题的哪些字段中找到并发现了我的错误。该错误是由于在下拉菜单中将列表项的Selected属性设置为不取消选择其他项而引起的,但是设置DropDownList的SelectedItem或SelectedIndex属性并不会取消选择先前选择的项。

因为这是我的代码,所以当它找到两个选项时,我可以用调试器停下来。使用quickView可以检查字段ddl.SelectedIndicesInternal.Count,这是一个受保护的字段,它将直接告诉您(需要循环)多少(以及如果查看数组的话)哪些元素被选中。不幸的是,这是一个受保护的字段,无法通过我的代码检查,而没有绕过保护级别。

+0

那么你写了你自己的在线验证器?我不认为你曾经将它打包成方法或库?非常酷的东西。一个建议,如果你满意的话,接受你自己的答案。我已经投了票。 – 2014-07-17 18:49:09

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"); 
       } 
      } 
     } 
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 
        )); 
     } 
    } 
} 

感谢分享与我们其余的斗争!