代码之家  ›  专栏  ›  技术社区  ›  TheVillageIdiot

ASP:用户控件中的文本控件为空

  •  5
  • TheVillageIdiot  · 技术社区  · 15 年前

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

    在使用控件的页面中,我调用 安装程序 控制方法 加载完成 事件处理程序(我首先调用它 负载 事件)。不管 我的业务对象 当我访问时,是否为空 字面意义的 在用户控件上,我得到错误:

    Object reference not set to an instance of an object.
    

    原因是什么?治疗方法是什么?

    7 回复  |  直到 7 年前
        1
  •  11
  •   TheVillageIdiot    15 年前

    这很简单。我在web.config的controls部分添加了一些东西,正如 Rick Sthral 在他的一篇文章中(:(要想了解这篇文章,你必须在他的页面上搜索)。

    它很好地允许我添加控件而不添加 @寄存器 但缺点是我控件上的子控件显示为空!所以我简单地说 @寄存器 在我的页面上有指示,它起作用了。

        2
  •  5
  •   Cᴏʀʏ bcherry    12 年前

    这完全取决于 怎样 您的web.config中包含了控件。如果您尝试在一个命名空间中包含所有控件,它将不起作用(尽管设计器将正确地向您显示控件列表):

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

    但是,如果您单独添加控件并指向它们的物理位置,它将按预期工作,而不必包含无休止的 @Register 指令。

    <add tagPrefix="prefix" tagName="Message" src="~/Controls/Message.ascx" />
    
        3
  •  1
  •   thomasb DaveRead    7 年前

    多谢,维拉盖迪奥特,我把你问题的答案贴出来了——我也遇到了同样的误解。

    通过添加控件

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

    在web.config中不足以实际使用它!我在一页上这样试过:

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

    …但这会导致一种现象,即用户控件内的所有控件都未初始化。只增加

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

    到页面顶部解决了问题:—)

    再次感谢!

        4
  •  0
  •   JerSchneid    15 年前

    你确定吗 MenuContainer 有问题吗?您正在引用 obj.State 在第一行 Setup 功能。如果 obj 如果为空,则会得到该错误。

        5
  •  0
  •   Community Nick Bolton    7 年前

    如回答中所述 JerSchneid ,如果obj为空,则会得到该错误。所以,试着这样做-

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

    编辑:我知道你在那条线上有一个错误,但是你可以试着这样做。否则,删除整个代码并保留 MenuContainer.Visible = false; 线。

        6
  •  0
  •   JerSchneid    15 年前

    如果 MenuContainer 为空,可能与页面生命周期的时间线有关。你以前调用过这个函数 菜单容器 连接起来。你能试着打电话吗 Setup 在页面加载函数中?

        7
  •  0
  •   to StackOverflow    15 年前

    您发布的代码如下:

    internal void Setup(MyBusinessObject obj)
    {    
        MenuObject menu = MenuHelper.GetMenu(obj.State);    
    
        if(obj == null)        
            MenuContainer.Visible = false;    //other code
    }
    
    • 如果obj为空,则在第一行取消引用obj.state将引发NullReferenceException

    • 如果obj不为空,则不会执行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
    }