2011-12-09 14 views
11

Mam następujący, ale to w przypadku braku z NullReferenceException:Jak uzyskać operację Null Coalesce w programie ASP.NET MVC Razor?

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

OneMonth jest zdefiniowany jako

public virtual decimal? OneMonth { get; set; } 

i jego wartość jest zerowa w momencie awarii.

Myślałem, że operator zerowego znoju przetestuje, czy jego wartość zerowa i jeśli tak, zwróci wartość po prawej stronie operatora?

Co muszę zmienić, aby to działało?

+3

Czy jesteś pewien, że to obiekt 'FundPerformance' wybrany przez' FirstOrDefault() 'jest pusty? Jeśli tak jest, to próbujesz uzyskać referencję od obiektu, który jest pusty, co daje 'NullReferenceException' –

+0

. Uważam, że Joakim ma rację. Poza tym powinieneś naprawdę wykonywać te obliczenia w ViewModelu i właśnie przekazywać odpowiedź do swojego widoku maszynki. A jeśli faktycznie robisz przeglądanie bazy danych z twojego widoku, to jest to bardzo niegrzeczne! :-) –

+0

Cześć chłopaki. Okazuje się, że obie są poprawne. Zrobiłem głupiego. Aby złagodzić wszelkie obawy, obiecuję, że nie wykonuję połączenia z bazą danych z widoku! ViewModel jest zapełniany w kontrolerze poprzez wywołanie usługi do repozytorium. – DaveDev

Odpowiedz

22

Skład brzytwy, tak jak to napisałeś, kończy się na "OneMonth". The ?? są interpretowane jako tekst. Aby to interpretować jak brzytwa, należy owinąć w całych wypowiedzi() tak:

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

ten będzie nadal Ci błąd: lewy operator jest dziesiętny i prawo operator jest ciągiem. Możesz więc albo wyrenderować zero zamiast "-", albo użyć potrójnego operatora, z OneMonth.Value.ToString() jako lewą wartością i "-" jako właściwą wartością.

1

To nie ma nic wspólnego z MVC ani Razor.

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

zwróci null, jeśli nie ma elementu, który pasuje, null nie posiada OneMonth porperty tak dostaniesz wyjątku null ref. Nie możesz użyć? operator, ponieważ nie jest jednomyślny, który jest zerowy, jest wynikiem FirstOrDefault().

Aby przetestować zmiany kodu do

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

Jeśli dostajesz „sekwencja zawiera żadnych elementów” wyjątek zamiast to wiesz, że jest problem.

+0

To był mój problem, który można naprawić za pomocą operatora null-warunkowego ('?') Oprócz wartości zerowej -operator koalescencji ('??'). 'string emptyIfNull = probablyNullObject? .PossiblyNullProperty ?? ""; ' – Sinjai

Powiązane problemy