私はascxコントロールを持っています。別のコントロール内のasp:dropdownlistはnullですpage_loadに
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="LanguageSelect.ascx.cs" Inherits="MyNamespace.LanguageSelect" %>
の背後にあるコードで
私はLanguageSelect
のPage_Loadの上でヒットデバッガで
<%@ 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"> ....
が、ドロップダウンはnullです!私がマークアップのドロップダウンコントロールを追加している場合は、常に存在するはずだと思っていました。この場合、動的コントロールのように振る舞います。
今、コントロールのSomePageがhtmlしかし、myTag
のこの1つはレンダリングされていないので、divのドロップダウンリストをラップすると問題はありません。divもレンダリングされません。
私はSomePage
をPage_Loadでブレークポイントを置く場合、langSelectコントロールが(nullではない)になりますが、それ自体がnull LanguageDropdown
UserControlはページに動的に追加されていますか?なぜなら、時には、コンストラクタを使う代わりに、 'Page.LoadControl'を使ってそのインスタンスを作成しなければならないことを忘れるからです。サイドノート:ページイベントを使用して暗黙的にUserControlを初期化することは、ほとんど常に悪い考えです。その代わりに、コントローラ(通常はページ)はコントロールを直接(つまり、メソッド 'BindData'または' Init'を呼び出して)初期化する必要があります。そうしないと、ライフサイクルの問題や予期しない動作につながる可能性があります。 –
@TimSchmelterいいえ、動的に追加されていません。...コントロールがマークアップとして追加されている場合、それは動的な権利ではないことを意味しますか? – lurscher