我有一个母版页,在加载事件中有这些行:
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";
整个过程都很好,所以看起来这条线路失败了。
答案 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类。您没有说明您正在运行的版本。所以这段代码可能不适用,但概念很合理。