如何在ASP.NET MVC Razor中使用Null Coalesce运算符?

24

我有以下代码,但是它会出现 NullReferenceException 错误:

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

OneMonth的定义为

public virtual decimal? OneMonth { get; set; }

当它失败时,它的值为null。

我认为Null Coalesce操作符会测试是否为null,如果是,则返回运算符右侧的值?

我需要更改什么才能使它起作用?


3
你确定不是因为 FirstOrDefault() 选择的 FundPerformance 对象为空吗?如果是这种情况,那么你将会尝试从一个空对象中获取引用,这将导致 NullReferenceException - Joakim Johansson
我认为Joakim是正确的。而且,你应该在ViewModel中进行这个计算,并将答案传递到你的Razor视图中。如果你实际上是从视图中进行数据库查找,那就太调皮了! :-) - Tom Chantler
大家好。事实证明你们都是正确的。我犯了一个愚蠢的错误。为了消除任何疑虑,我保证我不会从视图中进行数据库调用!ViewModel是通过Controller通过对Repository的Service调用来填充的。 - DaveDev
相关:http://stackoverflow.com/questions/7729024/asp-net-mvc-razor-ternary - Nathan Hartley
2个回答

36

根据你写的 Razor 语法,它在 "OneMonth" 结束。?? 被解释为文本。如果想要它被解释为 Razor 代码,你需要像这样将整个语句用 () 包围起来:

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

这仍然会导致错误:左操作数是十进制数,右操作数是字符串。因此,您可以使用三元运算符,以OneMonth.Value.ToString()作为左值,"-"作为右值,或者在渲染时显示零而不是 "-"。


1

这与MVC或Razor无关。

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

如果没有匹配的元素,将返回 null,null 没有 OneMonth 属性,因此您将获得 null 引用异常。您不能使用 ?? 运算符,因为 null 不是 OneMonth,而是 FirstOrDefault() 的结果。

要进行测试,请更改您的代码为

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

如果你得到了一个“序列不包含任何元素”的异常,那么你就知道这是你的问题了。

2
这是我的问题,可以使用空值条件运算符(?)以及空值合并运算符(??)来解决。string emptyIfNull = possiblyNullObject?.PossiblyNullProperty ?? ""; - Sinjai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接