Обработка NullReferenceException во встроенном коде asp.net - PullRequest
0 голосов
/ 16 февраля 2011

У меня есть некоторый встроенный код в файле aspx, который выполняет:

<dd><%=  encode(Listing.Address.Line1) %> </dd>

Проблема в том, что при определенных обстоятельствах объект Listing будет нулевым, и поэтому ссылки на свойства, такие как Address, будут вызывать исключение. Как мне справиться с этим исключением? Я в основном хочу игнорировать это: поймать его, а затем продолжить обычное выполнение / рендеринг страницы.

Ответы [ 3 ]

5 голосов
/ 16 февраля 2011

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

<%= encode(Listing != null && Listing.Address != null ? Listing.Address.Line1 : string.Empty) %> 

И обязательно проверьте адрес на всякий случай. Короткое замыкание - ваш друг, порядок имеет значение в && ing.

Не видя более широкой картины, я бы предложил, чтобы у вашей модели представления, если она у вас есть, был метод, который делает это автоматически для вас. Такие вещи становятся ужасными, если они есть везде.

1 голос
/ 16 февраля 2011

Предполагая, что проблема довольно проста, где Listing не равно нулю, и, следовательно, все его базовые атрибуты не равны нулю, вы можете ввести что-то вроде этого:

<% = encode ((Листинг ?? (новый листинг (AddressObj))). Address.Line1)%>

Вы можете написать класс Listing здесь с помощью конструктора, так что Address.Line1 всегда будет иметь значение.

Теперь, если ваша проблема довольно сложна, где у вас Listing объект может иметь действительный экземпляр, но его базовый атрибут может не иметь: лучший способ - заключить метод кодирования в другой метод или свойство, которое будет возвращать ожидаемый результат и назовите это в разметке.

public string EncodedAddress
{
    get
    {
        if (Listing == null)
            return string.Empty;
        if (Listing.Address == null)
            return string.Empty;
        return encode(Listing.Address.Line1);
    }
}

В разметке вы делаете что-то вроде:

<%= EncodedAddress %>
0 голосов
/ 16 февраля 2011

Используйте это

<%= if(Listing.Address.Line1 != null)
      { 
         encode(Listing.Address.Line1)
      }
%> 
...