asp:用户控件中的Literal控件为null

时间:2009-05-21 03:50:50

标签: c# asp.net user-controls

我有一个包含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.

是什么原因以及对此有何补救措施?

7 个答案:

答案 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)

JerSchneid的答案所述,如果obj为null,您将收到该错误。所以,试试这样做 -

internal void Setup(MyBusinessObject obj)
{
    if(obj == null)
        MenuContainer.Visible = false;
    else
        MenuObject menu = MenuHelper.GetMenu(obj.State);
}
编辑:我知道你在这一行收到错误,但试试这样做。或者,删除整个代码,然后保留MenuContainer.Visible = false;行。

答案 4 :(得分:0)

如果MenuContainer为null,则可能与页面生命周期的时间线有关。您在链接MenuContainer之前调用该函数。您可以尝试在Page_Load函数中调用Setup吗?

答案 5 :(得分: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
}

答案 6 :(得分:0)

您确定MenuContainer是问题吗?您在obj.State函数的第一行引用了Setup。如果obj为空,则会收到该错误。