当我使用LoadControl( type, Params )
时,出现了问题。让我解释一下...
我有一个超级简单的用户控件(ascx)。
<%@ Control Language="C#" AutoEventWireup="True" Inherits="ErrorDisplay" Codebehind="ErrorDisplay.ascx.cs" EnableViewState="false" %>
<asp:Label runat="server" ID="lblTitle" />
<asp:Label runat="server" ID="lblDescription" />
使用 C# 编写后台代码:
public partial class ErrorDisplay : System.Web.UI.UserControl
{
private Message _ErrorMessage;
public ErrorDisplay()
{
}
public ErrorDisplay(Message ErrorMessage)
{
_ErrorMessage = ErrorMessage;
}
protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
if (_ErrorMessage != null)
{
lblTitle.Text = _ErrorMessage.Message;
lblDescription.Text = _ErrorMessage.Description;
}
}
}
在我的 web 应用程序的其他地方,我使用以下代码将用户控件的实例添加到页面中:
divValidationIssues.Controls.Add(LoadControl(typeof(ErrorDisplay), new object[] { MessageDetails }));
我正在使用LoadControl的重载版本,因为我想将Message参数传递给构造函数。所有这些看起来都很好。
但是,当ErrorDisplay用户控件上的OnPreRender()被触发时,lblTitle和lblDescription变量都为null,尽管它们具有标记等效物。message变量已经正确填充。
是否有人可以解释为什么会发生这种情况?
谢谢
编辑:
只是为了澄清,我还要补充一下,以编程方式向页面添加用户控件的代码是响应按钮按下事件而运行的,因此“hosting page”已经经历了Init、Page_Load,并且现在正在处理事件处理程序。
我无法在更早的asp生命周期阶段添加用户控件,因为它们是响应按钮点击事件而创建的。