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中,langSelect控件将在那里(不为null),但它本身有一个null LanguageDropdown
Page.LoadControl而不是使用构造函数来创建它的实例.例如:
<%@ Register TagPrefix="uc1" TagName="Lang" Src="controls/LanguageSelect.ascx" %>
Run Code Online (Sandbox Code Playgroud)
旁注:使用页面事件来UserControl隐含初始化几乎总是一个坏主意.代替控制器(通常为页)应直接初始化控制(通过调用一个方法类似BindData或Init).否则可能导致生命周期问题或恶意错误.