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";
而且整个事情正常工作,因此它似乎只是此行失败。
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;
感谢您的时间,它抛出了不幸的同样的错误:-( – 2010-08-10 15:32:05
你Panel控件将最有可能被嵌套在页面形成控制,WIL我是页面控制的孩子。
为了得到这个工作,你可以创建某种递归方法来定位你之后,然后才检查,看看是否你已经尝试的任何属性值分配给它之前位于它的控制。
它刚刚停止工作在我的母版页上,在它自己的页面上,它工作的很好,这是错误的方式来更改元素的CSS类? – 2010-08-10 15:23:21
分配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类中。你不会说你正在运行的是什么版本。所以这个代码可能不适用,但是这个概念是正确的。
感谢您的时间,但同样的错误适用:-S – 2010-08-10 16:18:43
是否查询字符串参数*有*除0,1,2或3之外的任何其他值?在任何订阅此主人的内容页面上? – 2010-08-10 15:11:15
那么,这表明'selectedMenu'为空 - 'menuID'的值是什么? – 2010-08-10 15:11:29
目前我只是测试它的0,1,2,3的值,如果它不是一个值,它默认为0.(int.tryParse) – 2010-08-10 15:18:35