[英]ASP.net c# crash on one line
我有一個母版頁,在on load事件中包含以下幾行:
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:對象引用未設置為對象的實例。
母版頁上包含以下元素:
<%@ 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為空時,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;
您的Panel控件很可能嵌套在頁面Form控件中,而Form控件是Page控件的子級。
為了使它起作用,您可以創建某種遞歸方法來定位要使用的控件,然后才嘗試嘗試為它分配任何屬性值,以查看是否已找到該控件。
您在錯誤的位置搜索面板。 母版頁不屬於頁面。 如果你改變
var selectedMenu = this.Page.FindControl("mnu" + menuID) as Panel;
至
var selectedMenu = this.Master.FindControl("mnu" + menuID) as Panel;
您可能會有更多的運氣。
PS我不記得將master屬性添加到Page類的時間。 您沒有說您正在運行什么版本。 因此,此代碼可能不適用,但是這個概念很合理。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.