asp: выпадающий список равен нулю на page_load - PullRequest
1 голос
/ 08 марта 2012

У меня есть элемент управления 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"> ....

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

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

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

Ответы [ 4 ]

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

Например:

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

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

1 голос
/ 09 марта 2012

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

1 голос
/ 08 марта 2012

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

  • удалите файл .ascx. *. Designer.cs
  • , щелкните правой кнопкой мыши файл ascx и выберите «Преобразовать в веб-приложение»

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

0 голосов
/ 09 марта 2012

Наконец-то разобрался с проблемой;когда элемент управления встроен в другой элемент управления, 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);
        }

После этого элемент управления будет отображаться идеально!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...