ASP.net c # вылет на одной строке - PullRequest
0 голосов
/ 10 августа 2010

У меня есть главная страница с этими строками в событии при загрузке:

    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";

Переменная установлена ​​нормально, но строка класса 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";

И все работает нормально, так что кажется, что эта строка не работает.

Ответы [ 4 ]

4 голосов
/ 10 августа 2010
var selectedMenu = this.Page.FindControl("mnu" + menuID) as Panel;

В приведенной выше строке либо не удается найти элемент управления на странице, соответствующий идентификатору, который вы передаете, либо он не может преобразовать найденный элемент управления в Panel.

Установитьточку останова на этой строке и убедитесь, что на странице есть элемент управления, соответствующий идентификатору, который, по вашему мнению, должен быть там.

1 голос
/ 10 августа 2010

Я думаю, что вы пропустили условие, в котором ничего нет в вашей строке запроса.Сначала вы должны проверить это:

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

Проверьте, является ли оно пустым или пустым и не отображать ваше подменю.

Редактировать:

хорошо, я вижу, что вы установили 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 голосов
/ 10 августа 2010

Вы ищете не в том месте для панели. Главная страница не является частью страницы. Если вы измените

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

до

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

Возможно, вам повезет больше.

PS Я не помню, когда мастер-свойство было добавлено в класс Page. Вы не говорите, какую версию вы используете. Поэтому этот код может не применяться, но концепция обоснована.

0 голосов
/ 10 августа 2010

Скорее всего, ваш элемент управления Panel будет вложен в элемент управления Form страниц, который будет дочерним по отношению к элементу управления Page.только затем проверьте, нашли ли вы его, прежде чем пытаться присвоить ему какие-либо значения свойств.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...