[英]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.