2010-08-10 97 views
0

我有一個母版頁,這些線路中的負載事件:ASP.net C#墜毀在一行

string menuIDdata = Page.Request.QueryString["mid"]; 
    menuID = 0; 

    // Get the menu ID 
    if (!int.TryParse(menuIDdata, out menuID)) 
    { 
     menuID = 0; 
    } 

    // Select the correct menu 
    var selectedMenu = this.Page.FindControl("mnu" + menuID) as Panel; 
    selectedMenu.CssClass = "navButtonO"; 

的VAR設定罰款,但CSS類線與錯誤崩潰:

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.

主網頁上有以下幾個要素:

<%@ Master Language="C#" AutoEventWireup="true" CodeBehind="AdminMaster.master.cs" Inherits="MySite.MasterPages.AdminMaster" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 
    1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml" > 
    <head id="mainHead" runat="server" > 
     <title>Administration</title> 
     <link rel="Stylesheet" href="../style/admin.css" />  
    </head> 
    <body> 

    <form id="mainForm" runat="server"> 

    <div class="topMenu">  

     <asp:Panel id="mnu0" runat="server" CssClass="navButton"> 
      <a href="admin.aspx?mid=0" class="navLink">Admin Home</a> 
     </asp:Panel> 

     <asp:Panel id="mnu1" runat="server" CssClass="navButton"> 
      <a href="admin.aspx?mid=1" class="navLink">User Manager</a> 
     </asp:Panel> 

     <asp:Panel id="mnu2" runat="server" CssClass="navButton"> 
      <a href="admin.aspx?mid=2" class="navLink">Products</a> 
     </asp:Panel> 

     <asp:Panel id="mnu3" runat="server" CssClass="navButtonR"> 
      <a href="../default.aspx" class="navLink">Back to Site</a> 
     </asp:Panel> 
    </div> 

    <br /><br /> 
    <asp:Panel id="subLinks" runat="server" CssClass="subMenu"></asp:Panel> 

    <div class="mainContent"> 
     <asp:contentplaceholder id="mainContent" runat="server" /> 
    </div> 



    </form> 
    </body> 
</html> 

任何想法?謝謝!我是.net的新手,這段代碼在它自己的頁面上工作得很好,我把它移到了母版頁上,並且我把縮小範圍縮小到了設置CSS類的那一行。

編輯

註釋掉行:

selectedMenu.CssClass = "navButtonO"; 

而且整個事情正常工作,因此它似乎只是此行失敗。

+0

是否查詢字符串參數*有*除0,1,2或3之外的任何其他值?在任何訂閱此主人的內容頁面上? – 2010-08-10 15:11:15

+0

那麼,這表明'selectedMenu'爲空 - 'menuID'的值是什麼? – 2010-08-10 15:11:29

+0

目前我只是測試它的0,1,2,3的值,如果它不是一個值,它默認爲0.(int.tryParse) – 2010-08-10 15:18:35

回答

4
var selectedMenu = this.Page.FindControl("mnu" + menuID) as Panel; 

上面一行要麼未能發現ID匹配你傳遞或者它未能投被發現到一個面板控件的頁上的控制。

設置在該行斷點,並確保有頁面,你認爲應該在那裏的ID匹配上的控件。

1

我想你丟失情況,你不必在你的查詢字符串什麼。 你應該先檢查一下:

string menuIDdata = Page.Request.QueryString["mid"]; 
if (String.IsNullOrEmpty(menuIDdata)) 
    return; 

檢查它是否是null或空,不使你的子菜單。

編輯:

確定我看到你設置爲0,當的queryString是空的,莫比你在尋找錯誤的方式母版,檢查了這一點: http://www.west-wind.com/Weblog/posts/5127.aspx 和試試這個方法:

/// <summary> 
/// Finds a Control recursively. Note finds the first match and exists 
/// </summary> 
/// <param name="ContainerCtl"></param> 
/// <param name="IdToFind"></param> 
/// <returns></returns> 
public static Control FindControlRecursive(Control Root, string Id) 
{ 
    if (Root.ID == Id) 
     return Root; 

    foreach (Control Ctl in Root.Controls) 
    { 
     Control FoundCtl = FindControlRecursive(Ctl, Id); 
     if (FoundCtl != null) 
      return FoundCtl; 
    } 

    return null; 
} 

用法:

var selectedMenu = FindControlRecursive(this.Master, "mnu" + menuID) as Panel; 
+0

感謝您的時間,它拋出了不幸的同樣的錯誤:-( – 2010-08-10 15:32:05

0

你Panel控件將最有可能被嵌套在頁面形成控制,WIL我是頁面控制的孩子。
爲了得到這個工作,你可以創建某種遞歸方法來定位你之後,然後才檢查,看看是否你已經嘗試的任何屬性值分配給它之前位於它的控制。

+0

它剛剛停止工作在我的母版頁上,在它自己的頁面上,它工作的很好,這是錯誤的方式來更改元素的CSS類? – 2010-08-10 15:23:21

+0

分配css類的方法很好,例外情況表明您試圖設置CssClass的一個我很驚訝Jarek的遞歸方法並沒有爲你工作,應該檢索你正在尋找的對象! – 2010-08-10 15:40:15

0

你在錯誤的地方爲面板搜索。主頁面不是頁面的一部分。如果更改

var selectedMenu = this.Page.FindControl("mnu" + menuID) as Panel; 

var selectedMenu = this.Master.FindControl("mnu" + menuID) as Panel; 

你可能有更多的運氣。

PS我不記得主屬性何時被添加到Page類中。你不會說你正在運行的是什麼版本。所以這個代碼可能不適用,但是這個概念是正確的。

+0

感謝您的時間,但同樣的錯誤適用:-S – 2010-08-10 16:18:43