2011-05-14 85 views
4

我在ASP.NET項目的許多地方使用Session變量來存儲數據。我通常寫這樣的:NullReferenceException當分配會話變量/值

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

但是,這次我在setter中得到一個NullReferenceException。據我所知,以上述方式分配Session變量是有效的。此外,會話不是null,也不是值。

對此的任何想法?

編輯:

增加了對在該物業所在的用戶控件的代碼。我正在使用ext.net,但這不應該與此有任何關係。有一種想法超出了我的想法:

UserControl(見下面)在頁面的代碼隱藏中動態添加。這與它有什麼關係?

我加入這樣的用戶控件(在頁面上):

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; 
      } 
     } 
    } 
} 
+4

您發佈的代碼看起來應該起作用。你可能會發布失敗的實例嗎? – SirViver 2011-05-14 22:13:17

+1

我一直使用相同的模式沒有問題。編號說這個問題是在別的地方。你可以在會話不存在的情況下設置值 – Jeff 2011-05-14 23:13:34

+0

@SirViver:它有很多代碼,是項目的一部分。它在UserControl中,我更新了帖子併發布了整個UserControl。 – Ted 2011-05-15 08:22:06

回答

1

我幾乎完全確保NullReferenceExceptionSetComment()拋出

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

,並張貼的地方全異常堆棧跟蹤,因爲沒有CoreComment的孩子控件(lblComment,lblCommentInfo)在您設置_Comment屬性的位置正確實例化。

這些子控件沒有實例化的原因確實是您當前添加CoreComment控件的方式。對於動態添加UserControls,您必須使用Page.LoadControl()(請參閱:here)創建控件的新實例,因爲它會執行一些幕後魔術以確保其正確初始化,其中包括子控件的實例化。

在一個旁註,我個人會改變SetComment()SetComment(CoreCommons.System.Comment comment)和使用參數,而不是重複調用的getter,或者,如果與原來住,至少調用吸氣只有一次,並將結果保存在一個局部變量。我認爲可能是InProc會話存儲,它不會有很大的區別,但是在任何其他存儲模式下,您都會無緣無故地反序列化Comment對象。

+0

謝謝。我被告知使用構造函數可以和使用LoadControl一樣好。我第一次嘗試LoadControl但得到了另一個(無關的)錯誤,所以我切換到使用構造函數。正如你所說,看起來使用構造函數並沒有真正實例化控件。 現在,出於某種原因,LoadControl的作品,當我使用該屬性的設置也適用。 Thx =) – Ted 2011-05-16 06:19:21

+0

作爲一個說明:我還沒有證實你的第一個錯誤是關於SetComment中的錯誤。它不太可能,儘管它在SetComment之前打破了。 – Ted 2011-05-16 06:22:52

0

您需要使用Page.LoadControl()方法,請看here

順便說一句:問題是用這種方式編程添加控件。

+1

確實。請參閱我對SirViver的評論=) – Ted 2011-05-16 06:19:48