asp:dropdownlist在page_load上为null

lur*_*her 1 c# asp.net .net-4.0 visual-studio-2010 drop-down-menu

我有一个ascx控件;

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="LanguageSelect.ascx.cs" Inherits="MyNamespace.LanguageSelect" %>
Run Code Online (Sandbox Code Playgroud)

代码背后:

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();
            }
        }
Run Code Online (Sandbox Code Playgroud)

在另一个控件内:

<%@ 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"> ....
Run Code Online (Sandbox Code Playgroud)

使用调试器我点击了page_load LanguageSelect,但是下拉列表为空!如果我在标记中添加下拉控件,我认为它应该始终存在,在这种情况下,它表现得像它只是一个动态控件..

现在,控件SomePage正在html中呈现,但是这个中的一个myTag根本没有呈现,如果我将下拉列表包装在div中无关紧要,div也不会呈现!!

如果我将断点放在SomePagepage_load中,lan​​gSelect控件将在那里(不为null),但它本身有一个null LanguageDropdown

Tim*_*ter 5

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

例如:

<%@ Register TagPrefix="uc1" TagName="Lang" Src="controls/LanguageSelect.ascx" %>
Run Code Online (Sandbox Code Playgroud)

旁注:使用页面事件来UserControl隐含初始化几乎总是一个坏主意.代替控制器(通常为页)应直接初始化控制(通过调用一个方法类似BindDataInit).否则可能导致生命周期问题或恶意错误.