asp: буквенный элемент управления null в пользовательском элементе управления - PullRequest
5 голосов
/ 21 мая 2009

У меня есть пользовательский элемент управления, который содержит asp: Literal.

<div>
     <asp:Literal id="MenuContainer" runat="server" />
</div>

На странице с выделенным кодом есть метод, который инициализирует элемент управления:

internal void Setup(MyBusinessObject obj)
{
    MenuObject menu = MenuHelper.GetMenu(obj.State);

    if(obj == null)
        MenuContainer.Visible = false;

    //other code
}

На странице, где используется элемент управления, я вызываю Настройка метод управления в LoadComplete обработчик события (я впервые вызывал его в Загрузка событие). Независимо от того, является ли MyBusinessObject нулевым или ненулевым, при доступе к Литерал в пользовательском элементе управления я получаю сообщение об ошибке:

Object reference not set to an instance of an object.

В чем причина и что за лекарство от этого?

Ответы [ 7 ]

11 голосов
/ 13 июля 2009

Это было очень просто. Я добавлял что-то в раздел управления web.config, как это было предложено Риком Страл в одном из его постов (:( для получения информации о посте, вам придется искать на его странице).

Приятно было добавлять элементы управления без добавления тега @ Register , но недостатком было то, что дочерние элементы управления на моих элементах управления отображались как нулевые! поэтому я просто поместил директиву @ Register на своих страницах, и она сработала.

5 голосов
/ 21 ноября 2010

Это зависит от того, как вы включаете элементы управления в свой web.config. Это не будет работать, если вы попытаетесь включить все элементы управления в пространство имен (хотя дизайнер правильно покажет вам список ваших элементов управления):

<add tagPrefix="prefix" namespace="example.ui.controls" assembly="example.ui" />

Но если вы добавите свои элементы управления индивидуально и укажете на их физическое местоположение, они будут работать так, как вы ожидаете, без необходимости включать бесконечные @Register директивы.

<add tagPrefix="prefix" tagName="Message" src="~/Controls/Message.ascx" />
1 голос
/ 23 сентября 2009

Спасибо, TheVillageIdiot, за публикацию ответа на вашу проблему - я столкнулся с точно таким же недоразумением.

Добавление элементов управления через

<add tagPrefix="user" namespace="Frontend.Web.UserControlsAccount" assembly="Frontend.Web" />

в web.config было недостаточно, чтобы использовать его на самом деле! Я попробовал это так на странице:

<user:ucLoginMessages runat="server" ID="Msgs" />

... но это привело бы к тому, что ни один из элементов управления внутри UserControl не был инициализирован. Только добавление

<%@ Register Src="~/UserControlsAccount/LoginMessages.ascx" TagPrefix="user" TagName="Messages" %>

к началу страницы решена проблема: -)

Еще раз спасибо!

0 голосов
/ 21 мая 2009

Вы отправили следующий код:

internal void Setup(MyBusinessObject obj)
{    
    MenuObject menu = MenuHelper.GetMenu(obj.State);    

    if(obj == null)        
        MenuContainer.Visible = false;    //other code
}
  • Если obj имеет значение null, разыменование obj.State в первой строке вызовет исключение NullReferenceException

  • Если значение obj не равно нулю, строка MenuContainer.Visible = false не будет выполнена.

Так что я не думаю, что вы публикуете весь соответствующий код.

Если у вас возникли трудности с отладкой такого рода вещей, попробуйте пройтись по коду с помощью отладчика или добавить некоторые утверждения в ваш код, которые помогут вам точно увидеть, что происходит:

internal void Setup(MyBusinessObject obj)
{    
    Debug.Assert(obj != null);
    MenuObject menu = MenuHelper.GetMenu(obj.State);    

    Debug.Assert(MenuContainer != null);
    if(obj == null)        
        MenuContainer.Visible = false;    //other code
}
0 голосов
/ 21 мая 2009

Если MenuContainer равно нулю, это, вероятно, связано с временной шкалой жизненного цикла страницы. Вы вызываете эту функцию до того, как MenuContainer будет подключено. Можете ли вы попробовать вызвать Setup в функции Page_Load?

0 голосов
/ 21 мая 2009

Как уже упоминалось в ответе JerSchneid , если obj равно нулю, вы получите эту ошибку. Итак, попробуйте сделать это так -

internal void Setup(MyBusinessObject obj)
{
    if(obj == null)
        MenuContainer.Visible = false;
    else
        MenuObject menu = MenuHelper.GetMenu(obj.State);
}

РЕДАКТИРОВАТЬ: Я знаю, что вы получаете ошибку в этой строке, но просто попробуйте сделать это так. Или же удалите весь код и просто оставьте строку MenuContainer.Visible = false;.

0 голосов
/ 21 мая 2009

Вы уверены, что MenuContainer это проблема? Вы ссылаетесь на obj.State в первой строке функции Setup. Если это obj равно нулю, вы получите эту ошибку.

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