2012-03-08 8 views
1

У меня есть элемент управления ascx;asp: dropdownlist is null on page_load

<%@ 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"> .... 

С отладчика я попал на Page_Load из LanguageSelect, но выпадающий равно нулю ! если я добавляю выпадающий элемент управления в разметке, я думал, что он всегда должен существовать, в этом случае он ведет себя так, как будто это был просто динамический элемент управления.

теперь элемент управления SomePage отображается в html , но этот в myTag вообще не отображается, не имеет значения, если я упакую выпадающий список в div, div также не будет отображаться!

Если я поставил точку останова в SomePage Page_Load, контроль langSelect будет там (не равно нулю), но она сама по себе имеет нулевую LanguageDropdown

+0

Является ли ваш UserControl динамически добавлен на страницу? Я прошу, потому что иногда люди забывают, что они должны создать экземпляр его с помощью 'Page.LoadControl' вместо использования конструктора. Side-Note: почти всегда плохо использовать идеи страницы для инициации UserControl неявно. Вместо этого контроллер (обычно страница) должен инициализировать элемент управления напрямую (например, путем вызова метода «BindData» или «Init»). В противном случае это может привести к проблемам жизненного цикла и непредсказуемому поведению. –

+0

@TimSchmelter нет, его не добавляются динамически, ну ... если элемент управления добавляется как разметка, это означает, что он НЕ динамичен правильно? – lurscher

ответ

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); 
     } 

После этого управление было отлично!

+0

Я думаю, вы должны сказать: «Когда элемент управления наследуется от другого элемента управления», а не «когда элемент управления встроен в другое управление». Это две совершенно разные вещи. – outlookrperson

+0

@rperson я не понимаю; 'LangSelect' не наследуется от' SomePage', он * встроен в него * – lurscher

5
  1. добавляется ваш UserControl динамически на странице? Я прошу, потому что иногда люди забывают, что они должны создать экземпляр этого файла через Page.LoadControl вместо использования конструктора.
  2. Вы зарегистрировали UserControl на странице?

Например:

<%@ Register TagPrefix="uc1" TagName="Lang" Src="controls/LanguageSelect.ascx" %> 

Побочное примечание: Это почти всегда плохая идея использовать события страницы для inititialize в UserControl неявным. Вместо этого контроллер (обычно страница) должен инициализировать элемент управления напрямую (путем вызова метода, такого как BindData или Init). В противном случае это может привести к проблемам жизненного цикла или неприятным ошибкам.

+0

Ну, сам пользовательский контроль - это подсетей sitecore – lurscher

+0

, что беспокоит то, что даже не имеет значения, что элемент управления динамический или нет (и его нет), потому что, если я выделяю LanguageDropdown и пытаюсь добавить его на страницу i получило бы ошибку, потому что я не могу изменить страницу при загрузке, инициализировать, визуализировать события – lurscher

1

Попробуйте удалить созданный автоматически файл .ascx.designer.cs и восстановить его. Чтобы сделать это, выполните следующие действия:..

  • удалить .ascx * designer.cs
  • правой кнопкой мыши файл ASCX и выберите "Преобразовать в веб-приложения"

теперь дизайнер .cs файл воссоздан. Посмотри, сработают ли сейчас вещи.

+0

не работал, и конструктор.cs кажется синхронизированным с разметкой в ​​любом случае – lurscher

1

Возможно, вы попытаетесь загрузить UserControl (.ascx) в качестве CustomControl (no .ascx). Проверьте страницу и страницу web.config/элементы управления для ссылок на пространство имен LanguageSelect вместо пути .ascx.

Смежные вопросы