Какой правильный шаблон для защиты от исключений NullReferenceException в ASP.NET MVC - PullRequest
5 голосов
/ 24 ноября 2010

UPDATE Проблема была синтаксической проблемой. @awrigley показывает правильный способ написать это в Razor.

Следующие работы:

@if(Model.Thing.Prop != null)
{
    Html.RenderPartial("SomePartialView", Model.Thing.Prop);
}

У вас есть требование показать подробности для верхних 1 Foo для данного Bar в виде таблицы HTML. Как скрыть пустую таблицу или показать сообщение «не найдено», если Foo равно нулю?

Например. Я получаю NullReferenceException в следующей строке, потому что Model.Thing.Prop - это null;

@{Html.RenderPartial("SomePartialView", Model.Thing.Prop);} 

Это намеренно ноль, мой репозиторий возвращает ноль вместо пустого Foo. Но это мягко не относится к вопросу, который равен нулю Model.Thing.Prop, я не хочу называть Html.RenderPartial.

Обновление
Я безуспешно пробовал следующее:

@if(Model.Thing.Prop != null)
{
    @{Html.RenderPartial("SomePartialView", Model.Thing.Prop);}
}

В результате Visual Studio сообщает, что ожидает строку ; в строке 1, столбце 1, а также, что ; является недопустимым выражением в строке 1, столбце 1 (полагаю, это связано с сбросить статус MVC3), и если я попаду на страницу в браузере, я получу

CS1501: нет перегрузки для метода 'Write', 0 аргументов

с выделенной строкой @Html.RenderPartial.

Я тоже пробовал

@if(Model.Thing.Prop != null)
{
    <text>
    @{Html.RenderPartial("SomePartialView", Model.Thing.Prop);}
    </text>
}

но это приводит к NullReferenceException изнутри моего Частичного просмотра, что не кажется правильным. Model.Thing определенно является действительным Bar, а Model.Thing.Prop определенно является null Foo.

Ответы [ 2 ]

2 голосов
/ 24 ноября 2010

Полагаю, вы не хотите использовать ...

@if (Model.Thing.Prop != null)
{Html.RenderPartial("SomePartialView", Model.Thing.Prop);} 

... потому что вы все еще хотите визуализировать часть частичного представления?

О нет. Правильно прочитал ваш пост.

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

EDIT:

Помните, что в Razor @ можно использовать двумя способами:

  1. Для выполнения операторов:

    @ { MyStatement; }

  2. Для оценки HtmlHelper, метода класса, свойства или переменной, которая возвращает строку той или иной формы (например, HtmlString, MvcHtmlString или string). Например:

    @MyClass.MyStringProperty

Обратите внимание, что в случае 2 завершающая точка с запятой не требуется.

1 и 2 указывают, что если у вас есть htmlhelper, который возвращает что-то отличное от строки (например, void), то вы должны вызвать его следующим образом:

@{Html.MyHelperThatReturnsVoid;}

Принимая во внимание, что с HtmlHelper, который возвращает строку или HtmlString или MvcHtmlString, вы можете просто написать:

@Html.MyHelperThatReturnsAString

Подробнее см. принятый ответ на вопрос, который я задал:

Пользовательский HtmlHelper, который возвращает пустую проблему


0 голосов
/ 24 ноября 2010

Это либо изменение MVC3, либо что-то странное.

MVC2 Поведение:Если Model.Thing имеет значение null, то да, это исключение null ref.Если Model.Thing существует и Thing.Prop имеет значение null, то вы передадите пустую ссылку на модель.Когда вы передаете пустой указатель на модель, родительская модель (модель здесь) передается в качестве модели в SomePartialView, который ожидал бы тип Prop (если только Model и Prop не совпадают).

Учитывая васВы получаете нулевой реф, я собираюсь предположить, что Model.Thing является нулевым.В этом случае единственным решением будет @if оператор.Передача нулевого значения в ссылку на модель просто не работает, и я немного оборвал поведение.

Опять же, это поведение MVC2, если это изменилось для MVC3, где вы честно можете передать нулевую модельофигенно!

...