ASP.net C#坠毁在一行

问题描述:

我有一个母版页,这些线路中的负载事件: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

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

上面一行要么未能发现ID匹配你传递或者它未能投被发现到一个面板控件的页上的控制。

设置在该行断点,并确保有页面,你认为应该在那里的ID匹配上的控件。

我想你丢失情况,你不必在你的查询字符串什么。 你应该先检查一下:

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

你Panel控件将最有可能被嵌套在页面形成控制,WIL我是页面控制的孩子。
为了得到这个工作,你可以创建某种递归方法来定位你之后,然后才检查,看看是否你已经尝试的任何属性值分配给它之前位于它的控制。

+0

它刚刚停止工作在我的母版页上,在它自己的页面上,它工作的很好,这是错误的方式来更改元素的CSS类? – 2010-08-10 15:23:21

+0

分配css类的方法很好,例外情况表明您试图设置CssClass的一个我很惊讶Jarek的递归方法并没有为你工作,应该检索你正在寻找的对象! – 2010-08-10 15:40:15

你在错误的地方为面板搜索。主页面不是页面的一部分。如果更改

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