我有一个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
答案 0 :(得分:5)
Page.LoadControl
而不是使用构造函数来创建它的实例。例如:
<%@ Register TagPrefix="uc1" TagName="Lang" Src="controls/LanguageSelect.ascx" %>
旁注:使用页面事件隐含地初始化UserControl
几乎总是一个坏主意。相反,控制器(通常是页面)应该直接初始化控件(通过调用BindData
或Init
等方法)。
否则会导致生命周期问题或恶意错误。
答案 1 :(得分:1)
尝试删除自动生成的“.ascx.designer.cs”文件并重新生成它。为此,请按照以下步骤操作:
现在重新创建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);
}
在此之后,控件呈现完美!