我先前也提出了这个问题here。我再次面临同样的问题。我有一个用户控件,显示来自某个业务对象的信息。我已经在两页上使用它了。在这两个页面中,我调用一个带有业务对象的方法,将用户控件上的控件(主要是asp标签)绑定到对象的属性。我在aspx页面的LoadComplete方法中调用此方法。
protected void Page_LoadComplete(object sender, EventArgs e)
{
control.LoadData(bussinessObject);
}
它在两个页面上都正常工作。现在我的第三页我正在使用相同的控件。现在,当我在这个新页面中调用 LoadData 时,我得到 NullReference 异常:
Object reference not set to an instance of an object.
Description: An unhandled exception occurred during the execution of the
current web request. Please review the stack trace for more information
about the error and where it originated in the code.
Exception Details: System.NullReferenceException: Object reference not set
to an instance of an object.
Source Error:
Line 91: lblOrgName.Text = obj.Name;
编辑: lblOrgName为NULL :(请帮帮我!
编辑2: 我介入了代码。在包含页面的页面页面加载之后,调用主页面的Page_Load,然后调用问题控件的页面加载。停止在此页面加载函数的右括号(})我在立即窗口中键入lblOrgName并显示为null :(
然后在包含用户控件的页面的LoadComplete中,我停止并在即时窗口中键入控件的名称。它将所有标签和其他控件显示为null。
编辑3:
我已按照Stendhal在答案中的建议将受保护的构造函数放在UserControl中:
protected OrgInfo(){ }
现在我收到了这个错误:
Compiler Error Message: CS0122: 'Controls.OrgInfo.OrgInfo()' is inaccessible
due to its protection level.
项目根目录中的aspx页面和OrgInfo控件位于Controls文件夹中。
编辑4:
我尝试在页面加载方法中创建所有控件(主要是标签),但是控件集合的数量是0(零)!
答案 0 :(得分:2)
如何将用户控件放在页面上?这在过去发生在我身上,原因是控件被意外添加为服务器控件而不是用户控件。控制中的所有子控制从未进行过实例化。
您可以通过在用户控件的代码隐藏中放置受保护的默认构造函数来检查这一点:
protected MyUserControl(){}
这样控件就无法实例化为服务器控件。
答案 1 :(得分:2)
我在页面中放了以下一行:
<%@ Register src="~/Controls/OrgInfo.ascx" TagName="OrgInfo" TagPrefix="proj1"/>
它有效!
答案 2 :(得分:0)
听起来好像控件“lblOrgName”正在尝试分配一个值但尚未构建/解析到aspx页面。
确保在有问题的aspx页面的@page指令中有以下设置:
AutoEventWireup="true"