我有一个包含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 事件处理程序中调用设置控件方法(我首先在 Load 中调用它事件)。无论 MyBusinessObject 是null还是非null,当我在用户控件上访问 Literal 时,我都会收到错误:
Object reference not set to an instance of an object.
是什么原因以及对此有何补救措施?
答案 0 :(得分:11)
非常简单。我在web.config的控件部分添加了一些内容,正如Rick Sthral在他的一篇帖子中所建议的那样(:(关于帖子,你必须在他的页面上搜索)。
很好地允许我添加控件而不添加 @ Register 标签,但缺点是我的控件上的子控件显示为null!所以我只需在我的页面中添加 @ Register 指令即可。
答案 1 :(得分:5)
这完全取决于您在web.config中包含控件的 。如果您尝试在命名空间中包含所有控件(尽管设计器将正确显示控件列表),它将无法工作:
<add tagPrefix="prefix" namespace="example.ui.controls" assembly="example.ui" />
但是,如果您单独添加控件并指向其物理位置,它将按预期工作,而不必包含无限的@Register
指令。
<add tagPrefix="prefix" tagName="Message" src="~/Controls/Message.ascx" />
答案 2 :(得分:1)
谢谢,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" %>
到页面顶部解决了问题: - )
再次感谢!
答案 3 :(得分:0)
您确定MenuContainer
是问题吗?您在obj.State
函数的第一行引用了Setup
。如果obj
为空,则会收到该错误。
答案 4 :(得分:0)
如JerSchneid的答案所述,如果obj为null,您将收到该错误。所以,试试这样做 -
internal void Setup(MyBusinessObject obj)
{
if(obj == null)
MenuContainer.Visible = false;
else
MenuObject menu = MenuHelper.GetMenu(obj.State);
}
编辑:我知道你在这一行收到错误,但试试这样做。或者,删除整个代码,然后保留MenuContainer.Visible = false;
行。
答案 5 :(得分:0)
如果MenuContainer
为null,则可能与页面生命周期的时间线有关。您在链接MenuContainer
之前调用该函数。您可以尝试在Page_Load函数中调用Setup
吗?
答案 6 :(得分:0)
您发布的代码如下:
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
}