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

asp:dropdownlist is null on page_load

  1. 您的UserControl是否动态添加到页面?我之所以这么问,是因为人们有时会忘记,他们必须通过Page.LoadControl创建它的实例,而不是使用构造函数
  2. 您是否在页面中注册了UserControl

例如:

<%@ Register TagPrefix="uc1" TagName="Lang" Src="controls/LanguageSelect.ascx" %>

附带说明:使用页面事件来隐含地初始化UserControl几乎总是一个坏主意。相反,控制器(通常是页面)应该直接初始化控件(通过调用类似BindDataInit的方法)。否则,它可能会导致生命周期问题或严重错误。

尝试删除自动生成的".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);
        }

之后,控件完美呈现!