NullReferenceException при назначении переменной / значения Session - PullRequest
4 голосов
/ 15 мая 2011

Во многих местах моего проекта ASP.NET я использовал переменную Session для хранения данных.Я обычно пишу что-то вроде этого:

public uint MyPropery 
{
    get 
    {
        object o = Session["MyProperty"];
        if (o != null)
            return (uint)o;
        else
            return 0;
    }
    set 
    {
        Session["MyProperty"] = value;
    }
}

Однако на этот раз я получаю исключение NullReferenceException в установщике.Насколько я знаю, допустимо назначать переменную Session вышеописанным способом.Кроме того, Session не является нулевым и не имеет значения.

Есть идеи по этому поводу?

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

Добавление кода для UserControl, в которомсвойство существует.Я использую ext.net, но это не должно иметь ничего общего с этим.Одна мысль, которая пришла мне в голову:

UserControl (см. Ниже) динамически добавляется в коде позади страницы.Может ли это иметь какое-либо отношение к этому?

Я добавляю UserControls вот так (на странице):

foreach(CoreCommons.System.Comment c in cg.Reply_Comments)
{
    WebApplicationExtNetTest.Secure.UserControls.CoreComment cc = new UserControls.CoreComment();
    cc._Comment = c; // here is where i get the NullRef
    this.Panel1.ContentControls.Add(cc);
}

Разметка:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="CoreComment.ascx.cs" Inherits="WebApplicationExtNetTest.Secure.UserControls.CoreComment" %>
<%@ Register Assembly="Ext.Net" Namespace="Ext.Net" TagPrefix="ext" %>

<ext:Panel runat="server" ID="CoreCommentOuterPanel" BodyStyle="background: #FFFDDE">
    <Items>
        <ext:ColumnLayout runat="server">
            <Columns>
                <ext:LayoutColumn ColumnWidth="0.8">
                    <ext:Image runat="server" ImageUrl="/Resources/bullet_triangle_green_16x16.png" Align="AbsMiddle"></ext:Image> 
                    <ext:Label runat="server" ID="lblCommentInfo"></ext:Label>
                </ext:LayoutColumn>
                <ext:LayoutColumn ColumnWidth="0.2"><ext:Button runat="server" ID="btnDelete" Icon="Delete"></ext:Button></ext:LayoutColumn>
            </Columns>
        </ext:ColumnLayout>
        <ext:Label runat="server" ID="lblComment"></ext:Label>
    </Items>
</ext:Panel>

Код-позади:

namespace WebApplicationExtNetTest.Secure.UserControls
{
    public partial class CoreComment : System.Web.UI.UserControl
    {
        public CoreCommons.System.Comment _Comment
        {
            get
            {
                object o = Session["CoreComment_ObjectId"];
                if (o != null)
                    return (tWorks.Core.CoreCommons.System.Comment)o;
                else
                    return null;
            }
            set
            {
                Session["CoreComment_ObjectId"] = value;
                SetComment();
            }
        }            

        protected void Page_Load(object sender, EventArgs e)
        {    
        }

        private void SetComment()
        {
            if (_Comment == null)
            {
                lblCommentInfo.Text = "";
                lblComment.Text = "";
            }
            else
            {
                lblCommentInfo.Text = _Comment.Author + ", " + _Comment.TimeStamp.ToString("g");
                lblComment.Text = _Comment.Text;
            }
        }
    }
}

Ответы [ 3 ]

1 голос
/ 15 мая 2011

Я почти полностью уверен, что NullReferenceException добавляется в SetComment(), потому что ни один из дочерних элементов управления CoreComment (lblComment, lblCommentInfo) не создается должным образом в точке, в которой вы задали свойство _Comment.

Причина, по которой эти дочерние элементы управления не создаются, - это то, как вы в настоящее время добавляете элементы управления CoreComment. Для динамического добавления UserControls вы должны использовать Page.LoadControl() (см .: здесь ), чтобы создать новый экземпляр элемента управления, поскольку он выполняет закулисную магию, чтобы гарантировать его правильную инициализацию, которая включает создание дочерних элементов управления.

В отношении sidenote лично я бы изменил SetComment() на SetComment(CoreCommons.System.Comment comment) и использовал бы параметр вместо неоднократного вызова метода получения, или, если он остался с оригиналом, по крайней мере, вызовите метод получения только один раз и сохраните результат в локальная переменная. Я предполагаю, что, вероятно, это хранилище сессий InProc, это не будет иметь большого значения, но в любом другом режиме хранения вы бы неоднократно десериализовали объект Comment без причины.

0 голосов
/ 15 мая 2011

Использование:

return Session["MyProperty"] as uint? ?? 0;

и отправить куда-нибудь полную трассировку стека исключений с внутренними исключениями (ями)

0 голосов
/ 15 мая 2011

Вам нужно использовать метод Page.LoadControl(), пожалуйста, посмотрите здесь

Кстати : проблема заключается в программном добавлении элемента управления таким способом.

...