簡體   English   中英

asp:用戶控件中的Literal控件為null

[英]asp:Literal control null in user control

我有一個包含asp:Literal的用戶控件。

<div>
     <asp:Literal id="MenuContainer" runat="server" />
</div>

代碼隱藏頁面中有一個初始化控件的方法:

internal void Setup(MyBusinessObject obj)
{
    MenuObject menu = MenuHelper.GetMenu(obj.State);

    if(obj == null)
        MenuContainer.Visible = false;

    //other code
}

在使用控件的頁面中,我在LoadComplete事件處理程序中調用控件的Setup方法(我在Load事件中首先調用它)。 無論MyBusinessObject為null還是非null,當我在用戶控件上訪問Literal時 ,我都會收到錯誤:

Object reference not set to an instance of an object.

是什么原因以及對此有何補救措施?

這很簡單。 我在web.config的控件部分添加了一些內容,正如Rick Sthral在他的一篇帖子中所建議的那樣 (:(關於帖子,你將不得不在他的頁面上搜索)。

很好地允許我添加控件而不放置@ Register標簽,但缺點是我的控件上的子控件顯示為null! 所以我只是將@ Register指令放在我的頁面中就可以了。

這取決於您在web.config中包含控件的確切方式 如果您嘗試在命名空間中包含所有控件(盡管設計器將正確顯示控件列表),它將無法工作:

<add tagPrefix="prefix" namespace="example.ui.controls" assembly="example.ui" />

但是如果您單獨添加控件並指向它們的物理位置,它將按預期工作,而不必包含無限的@Register指令。

<add tagPrefix="prefix" tagName="Message" src="~/Controls/Message.ascx" />

謝謝,TheVillageIdiot,發布了你的問題的答案 - 我遇到了完全相同的誤解。

通過添加控件

<add tagPrefix="user" namespace="Frontend.Web.UserControlsAccount" assembly="Frontend.Web" />

在web.config中實際使用它還不夠! 我在頁面上嘗試過這樣的事情:

<user:ucLoginMessages runat="server" ID="Msgs" />

...但是這會導致這種現象,即UserControl中沒有任何控件被初始化。 只添加

<%@ Register Src="~/UserControlsAccount/LoginMessages.ascx" TagPrefix="user" TagName="Messages" %>

到頁面頂部解決了問題:-)

再次感謝!

你確定MenuContainer是問題嗎? 您正在Setup函數的第一行中引用obj.State 如果該obj為null,您將收到該錯誤。

正如JerSchneid的回答中所提到的,如果obj為null,那么你會得到那個錯誤。 所以,試試這樣做 -

internal void Setup(MyBusinessObject obj)
{
    if(obj == null)
        MenuContainer.Visible = false;
    else
        MenuObject menu = MenuHelper.GetMenu(obj.State);
}

編輯:我知道你在這一行得到了一個錯誤,但只是嘗試這樣做。 或者,刪除整個代碼,然后保持MenuContainer.Visible = false; 線。

如果MenuContainer為null,則可能與頁面生命周期的時間線有關。 您在連接MenuContainer之前調用該函數。 你可以嘗試在Page_Load函數中調用Setup嗎?

您發布的代碼如下:

internal void Setup(MyBusinessObject obj)
{    
    MenuObject menu = MenuHelper.GetMenu(obj.State);    

    if(obj == null)        
        MenuContainer.Visible = false;    //other code
}
  • 如果obj為null,則在第一行解除引用obj.State將拋出NullReferenceException

  • 如果obj不為null,則不會執行MenuContainer.Visible = false行。

所以我認為你沒有發布所有相關代碼。

如果您在調試此類問題時遇到困難,請嘗試使用調試器逐步執行代碼或在代碼中添加一些斷言,這將幫助您准確了解正在發生的事情:

internal void Setup(MyBusinessObject obj)
{    
    Debug.Assert(obj != null);
    MenuObject menu = MenuHelper.GetMenu(obj.State);    

    Debug.Assert(MenuContainer != null);
    if(obj == null)        
        MenuContainer.Visible = false;    //other code
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM