Как заставить оператор Null Coalesce работать в ASP.NET MVC Razor?

У меня есть следующее, но оно не работает с NullReferenceException:

<td>@item.FundPerformance.Where(xx => fund.Id == xx.Id).FirstOrDefault().OneMonth ?? -</td>

OneMonth определяется как

public virtual decimal? OneMonth { get; set; }

и его значение равно null в момент сбоя.

Я думал, что оператор Null Coalesce проверит, является ли он нулевым, и если да, вернет значение справа от оператора?

Что мне нужно изменить, чтобы это заработало?


person DaveDev    schedule 09.12.2011    source источник
comment
Вы уверены, что это не FundPerformance-объект, выбранный FirstOrDefault(), который является нулевым? Если это так, то вы пытаетесь получить ссылку от объекта, который имеет значение null, что дает NullReferenceException   -  person Joakim Johansson    schedule 09.12.2011
comment
Я считаю, что Йоаким прав. Кроме того, вы действительно должны выполнять этот расчет в ViewModel и просто передавать ответ в свое представление бритвы. И если вы на самом деле выполняете поиск в базе данных из своего представления, то это очень непослушно! :-)   -  person Tom Chantler    schedule 09.12.2011
comment
Привет, ребята. Оказывается, вы оба правы. Я сделал глупость. Просто чтобы смягчить любые опасения, я обещаю, что не буду выполнять вызов базы данных из View! ViewModel заполняется в контроллере через сервисный вызов репозитория.   -  person DaveDev    schedule 09.12.2011
comment
Связанный: stackoverflow.com/questions/7729024/asp-net -mvc-бритва-тройной   -  person Nathan Hartley    schedule 19.11.2015


Ответы (2)


Синтаксис бритвы, как вы его написали, заканчивается на «OneMonth». ?? интерпретируются как текст. Чтобы он интерпретировался как бритва, вы должны обернуть все операторы в () следующим образом:

<td>@(item.FundPerformance.Where(xx => fund.Id == xx.Id).FirstOrDefault().OneMonth ?? "-")</td>

Это все равно приведет к ошибке: левый оператор — десятичная дробь, а правый — строка. Таким образом, вы можете либо отобразить ноль вместо «-», либо использовать тернарный оператор с OneMonth.Value.ToString() в качестве левого значения и «-» в качестве правого значения.

person Matteo Mosca    schedule 09.12.2011

Это не имеет ничего общего с MVC или Razor.

FundPerformance.Where(xx => fund.Id == xx.Id).FirstOrDefault()

вернет null, если нет соответствующего элемента, null не имеет порперти OneMonth, поэтому вы получите исключение null ref. Вы не можете использовать ?? оператор, так как это не OneMonth, который имеет значение null, это результат FirstOrDefault().

Чтобы проверить, измените свой код на

FundPerformance.Where(xx => fund.Id == xx.Id).First().OneMonth ?? -</td>

Если вместо этого вы получаете исключение «последовательность не содержит элементов», вы знаете, что это ваша проблема.

person Ben Robinson    schedule 09.12.2011
comment
Это была моя проблема, которую можно исправить с помощью оператора с нулевым условием (?) в дополнение к оператору объединения с нулевым значением (??). string emptyIfNull = possiblyNullObject?.PossiblyNullProperty ?? ""; - person Sinjai; 27.02.2018