ASP.net c#崩溃在一条线上

时间:2010-08-10 15:07:50

标签: c# asp.net crash

我有一个母版页,在加载事件中有这些行:

    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类行因错误而崩溃:

  

异常详细信息:   System.NullReferenceException: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";

整个过程都很好,所以看起来这条线路失败了。

4 个答案:

答案 0 :(得分:4)

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

上述行无法在页面上找到与您传递的ID相匹配的控件,或者无法将控件发送到Panel。

在该行上设置一个断点,并确保页面上有一个与您认为应该存在的ID匹配的控件。

答案 1 :(得分:1)

我认为你错过了你的查询字符串中没有任何内容的情况。 你应该先检查一下:

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

检查它是否为空或空,并且不渲染子菜单。

编辑:

好吧,我看到你设置为0,当queryString为空时,maby你正在以错误的方式搜索母版页,请检查出来: 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; 

答案 2 :(得分:0)

您的Panel控件很可能嵌套在Form控件页面中,该控件将是Page控件的子控件 要使其工作,您可以创建某种递归方法来定位您所使用的控件,然后在尝试为其分配任何属性值之前检查是否已找到它。

答案 3 :(得分:0)

您在错误的地方搜索小组。母版页不是页面的一部分。如果你改变了

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

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

你可能会有更多的运气。

PS我不记得何时将master属性添加到Page类。您没有说明您正在运行的版本。所以这段代码可能不适用,但概念很合理。