asp:dropdownlist is null on page_load
本文关键字:page load on null dropdownlist is asp | 更新日期: 2023-09-27 18:27:05
我有一个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控件将在那里(不是null),但它本身有一个null LanguageDropdown
- 您的UserControl是否动态添加到页面?我之所以这么问,是因为人们有时会忘记,他们必须通过
Page.LoadControl
创建它的实例,而不是使用构造函数 - 您是否在页面中注册了UserControl
例如:
<%@ Register TagPrefix="uc1" TagName="Lang" Src="controls/LanguageSelect.ascx" %>
附带说明:使用页面事件来隐含地初始化UserControl
几乎总是一个坏主意。相反,控制器(通常是页面)应该直接初始化控件(通过调用类似BindData
或Init
的方法)。否则,它可能会导致生命周期问题或严重错误。
尝试删除自动生成的".ascx.designer.cs"文件并重新生成。要执行此操作,请执行以下步骤:
- 删除.ascx.*.designer.cs
- 右键单击ascx文件,然后选择"转换为Web应用程序"
现在,designer.cs文件被重新创建。看看事情现在是否会奏效。
它可能正在尝试将您的UserControl
(.ascx)加载为CustomControl
(no.asx)。请检查您的页面和web.config pages/controls部分是否引用了LanguageSelect
的命名空间,而不是.ascx路径。
终于解决了问题;当控件嵌入到其他控件中时,ASP.NET假定您将覆盖呈现(它不会自动呈现子控件)
我不得不对Page_Load进行以下更改,基本上是分配控件:
protected void Page_Load(object sender, EventArgs e)
{
Languages = GetSiteLanguagesService();
if (Languages.Count > 1)
{
LanguageDropdown = new DropDownList(); //allocate the control
LanguageDropdown.Visible = true;
LanguageDropdown.DataTextField = "DisplayName";
LanguageDropdown.DataValueField = "LangUrl";
LanguageDropdown.DataSource = Languages ;
LanguageDropdown.DataBind();
}
}
然后,为OnRender处理程序添加一个覆盖:
protected override void Render(HtmlTextWriter writer)
{
base.Render(writer);
LanguageDropdown.RenderControl(writer);
}
之后,控件完美呈现!