2010-10-09 33 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 
        )); 
     } 
    } 
} 

感謝分享與我們其餘的鬥爭!