【问题标题】:How to get the Null Coalesce operator to work in ASP.NET MVC Razor?如何让 Null Coalesce 运算符在 ASP.NET MVC Razor 中工作?
【发布时间】:2012-01-16 16:07:53
【问题描述】:

我有以下内容,但使用 NullReferenceException 失败:

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

OneMonth 定义为

public virtual decimal? OneMonth { get; set; }

并且在失败时它的值为 null。

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

我需要进行哪些更改才能完成这项工作?

【问题讨论】:

  • 你确定不是FirstOrDefault()选择的FundPerformance-object为null吗?如果是这种情况,那么您将尝试从为空的对象中获取引用,这会给出NullReferenceException
  • 我认为 Joakim 是对的。此外,您确实应该在 ViewModel 中进行此计算,并将答案传递到您的剃刀视图中。而且,如果您实际上是从您的视图中进行数据库查找,那么这非常顽皮! :-)
  • 大家好。事实证明你俩都是正确的。我做了一个蠢事。只是为了减轻任何担忧,我保证我不会从视图中进行数据库调用! ViewModel 通过对 Repository 的 Service 调用填充到 Controller 中。

标签: c# asp.net-mvc razor null-coalescing-operator


【解决方案1】:

如您所写,剃刀语法以“OneMonth”结束。这 ??被解释为文本。要将其解释为剃刀,您必须将整个语句包装在 () 中,如下所示:

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

这仍然会给你一个错误:左运算符是小数,右运算符是字符串。因此,您可以呈现零而不是“-”或使用三元运算符,将 OneMonth.Value.ToString() 作为左值,将“-”作为右值。

【讨论】:

    【解决方案2】:

    这与 MVC 或 Razor 无关。

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

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

    为了测试改变你的代码

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

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

    【讨论】:

    • 这是我的问题,除了使用空合并运算符 (??) 之外,还可以使用空条件运算符 (?) 来解决此问题。 string emptyIfNull = possiblyNullObject?.PossiblyNullProperty ?? "";
    猜你喜欢
    • 2012-07-07
    • 2017-07-13
    • 2018-06-24
    • 2015-01-20
    • 2016-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-17
    相关资源
    最近更新 更多