asp:dropdownlist在page_load上为null

时间:2012-03-08 15:39:18

标签: c# asp.net visual-studio-2010 .net-4.0 drop-down-menu

我有一个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中,lan​​gSelect控件将在那里(不为null),但它本身有一个null LanguageDropdown

4 个答案:

答案 0 :(得分:5)

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

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

    旁注:使用页面事件隐含地初始化UserControl几乎总是一个坏主意。相反,控制器(通常是页面)应该直接初始化控件(通过调用BindDataInit等方法)。 否则会导致生命周期问题或恶意错误。

答案 1 :(得分:1)

尝试删除自动生成的“.ascx.designer.cs”文件并重新生成它。为此,请按照以下步骤操作:

  • 删除.ascx。*。designer.cs
  • 右键单击ascx文件并选择“转换为Web应用程序”

现在重新创建designer.cs文件。看看现在的事情是否会奏效。

答案 2 :(得分:1)

可能正在尝试将UserControl(。ascx)加载为CustomControl(无.ascx)。检查您的页面和web.config页面/控件部分,以获取对LanguageSelect命名空间的引用,而不是.ascx路径。

答案 3 :(得分:0)

最后,弄明白了这个问题;当控件嵌入到其他控件中时,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);
        }

在此之后,控件呈现完美!