繁体   English   中英

asp:dropdownlist在page_load上为null

[英]asp:dropdownlist is null on page_load

我有一个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,但下拉列表为null! 如果我在标记中添加了下拉控件,我认为它应该始终存在,在这种情况下,它的行为就像是一个动态控件。

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

如果将断点放在SomePage page_load中,则langSelect控件将存在(不为null),但它本身具有null LanguageDropdown

  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 (无.ascx)。 检查页面和web.config页面/控件部分,以获取对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);
        }

此后,控件呈现完美!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM