【发布时间】:2012-03-08 15:39:18
【问题描述】:
我有一个 ascx 控件;
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="LanguageSelect.ascx.cs" Inherits="MyNamespace.LanguageSelect" %>
后面有代码:
protected void Page_Load(object sender, EventArgs e)
{
Languages = GetSiteLanguagesService();
if (Languages.Count > 1)
{
//null reference exception here!! languageDropdown is null!
LanguageDropdown.Visible = true;
LanguageDropdown.DataTextField = "DisplayName";
LanguageDropdown.DataValueField = "LangUrl";
LanguageDropdown.DataSource = Languages ;
LanguageDropdown.DataBind();
}
}
在另一个控件中:
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="SomePage.ascx.cs" Inherits="myNamespace.SomePage" %>
<div id="main" role="main">
<myTag:LanguageSelect id="langSelect" runat="server" />
<div class="section columns">
<div class="main-column"> ....
使用调试器,我点击了LanguageSelect 的page_load,但下拉列表为空!如果我在标记中添加下拉控件,我认为它应该始终存在,在这种情况下,它的行为就像它只是一个动态控件..
现在,控件 SomePage 正在 html 中呈现,但 myTag 中的这个控件根本没有被呈现,如果我将下拉列表包装在 div 中也没关系,div 不会被呈现要么!!
如果我将断点放在SomePage page_load 中,langSelect 控件将在那里(不为空),但它本身有一个空 LanguageDropdown
【问题讨论】:
-
您的 UserControl 是否动态添加到页面中?我问是因为人们有时会忘记他们必须通过
Page.LoadControl创建它的实例而不是使用构造函数。旁注:使用页面事件来隐式初始化 UserControl 几乎总是一个坏主意。相反,控制器(通常是页面)应该直接初始化控件(例如,通过调用方法BindData或Init)。否则可能会导致生命周期问题和不可预测的行为。 -
@TimSchmelter 不,它不是动态添加的,嗯...如果控件作为标记添加,这意味着不是动态的吗?
标签: c# asp.net visual-studio-2010 .net-4.0 drop-down-menu