2011-12-09 37 views
11

我有以下,但它與NullReferenceException失敗:如何讓Null Coalesce運算符在ASP.NET MVC Razor中工作?

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

OneMonth被定義爲

public virtual decimal? OneMonth { get; set; } 

其值爲null在它失敗的時間。

我認爲空合併運算符會測試它是否爲空,如果是,則返回值的運算符的權利?

我需要做些什麼才能完成這項工作?

+3

您確定它不是'FirstOrDefault()'選擇的'FundPerformance'對象,它是null嗎?如果是這種情況,你會試圖從一個null對象的引用,這給出了一個'NullReferenceException' –

+0

我認爲Joakim是正確的。此外,你應該真的在ViewModel中做這個計算,並將答案傳遞給你的剃刀視圖。如果你真的從你的角度來看數據庫查詢,那很淘氣! :-) –

+0

嗨,大家好。事實證明你們倆都是對的。我做了一個愚蠢的。只是爲了減輕任何擔憂,我保證我沒有從視圖進行數據庫調用! ViewModel通過對存儲庫的服務調用填充到Controller中。 – DaveDev

回答

22

您寫的剃刀語法以「OneMonth」結尾。 ?? ??被解釋爲文本。把它解釋爲剃刀,必須整個包住報表()這樣的:

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

這仍然會得到你一個錯誤:左操作者是一個小數和右操作是一個字符串。所以你可以使用零來代替「 - 」或使用三元運算符,OneMonth.Value.ToString()作爲左值,「 - 」作爲右值。

1

這與MVC或Razor無關。如果沒有元素匹配,空不具有OneMonth porperty所以你會得到一個空裁判例外

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

將返回null。你不能使用??因爲它不是OneMonth,它是空的,這是FirstOrDefault()的結果。

要測試更改代碼

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

如果你得到一個「序列不包含任何元素」,而不是例外,那麼你知道這是你的問題。

+0

這是我的問題,可以使用空條件運算符('?')除了null合併運算符('??')。 'string emptyIfNull = possibleNullObject?.PossiblyNullProperty ?? 「」;' – Sinjai