[英]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
Page.LoadControl
创建它的一个实例,而不是使用构造函数。 例如:
<%@ Register TagPrefix="uc1" TagName="Lang" Src="controls/LanguageSelect.ascx" %>
旁注:使用页面事件隐式初始化UserControl
几乎总是一个坏主意。 相反,控制器(通常是页面)应该直接初始化控件(通过调用BindData
或Init
类的方法)。 否则会导致生命周期问题或令人讨厌的错误。
尝试删除自动生成的“ .ascx.designer.cs”文件并重新生成它。 为此,请按照下列步骤操作:
现在,重新创建了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.