2011-12-09 14 views
11

Tengo el siguiente, pero es en su defecto con un NullReferenceException:¿Cómo hacer que el operador Nulo Coalesce trabaje en ASP.NET MVC Razor?

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

OneMonth se define como

public virtual decimal? OneMonth { get; set; } 

y su valor es nulo en el momento en que se produce un error.

Pensé que el operador Nulo Coalesce probaría si es nulo y, en caso afirmativo, devolverá el valor a la derecha del operador?

¿Qué debo cambiar para que funcione?

+3

¿Estás seguro de que no es el objeto 'FundPerformance' seleccionado por' FirstOrDefault() 'que es nulo? Si ese es el caso de lo que estaría tratando de obtener una referencia de un objeto que es nulo, que da una 'NullReferenceException' –

+0

creo que Joakim tiene razón. Además, realmente debería estar haciendo este cálculo en un ViewModel y simplemente pasar la respuesta a su vista de afeitar. ¡Y si en realidad está haciendo una búsqueda de base de datos desde su vista, entonces eso es muy malo! :-) –

+0

Hola chicos. Resulta que tus dos son correctos. Hice una tontería. Solo para aliviar cualquier preocupación, ¡prometo que no estoy haciendo la llamada a la base de datos desde View! ViewModel se llena en el controlador a través de una llamada de servicio al repositorio. – DaveDev

Respuesta

22

La sintaxis de la afeitadora, como la escribió, termina en "OneMonth". Los ?? se interpretan como texto. Para tenerlo interpretarse como la maquinilla de afeitar, debe envolver el conjunto de declaraciones de() así:

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

Esto todavía aparecerá un error: el operador izquierda es un decimal y el operador de la derecha es una cadena. Por lo tanto, puede representar un cero en lugar de "-" o utilizar un operador ternario, con OneMonth.Value.ToString() como valor de la izquierda y "-" como valor de la derecha.

1

No tiene nada que ver con MVC o Razor.

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

devolverá un valor nulo si no hay ningún elemento que los partidos, nula no tiene porperty OneMonth por lo que obtendrá una excepción de referencia nula. No puedes usar el ?? operador ya que no es OneMonth que es nulo, es el resultado de FirstOrDefault().

Para probar cambiar su código para

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

Si se obtiene una "secuencia no contiene elementos de" excepción entonces usted sabe que es su problema.

+0

Este fue mi problema, que se puede solucionar mediante el operador nulo-condicional ('?') Además del nulo -Capacificante de operador ('??'). 'string emptyIfNull = posiblementeNullObject? .PossiblyNullProperty ?? ""; ' – Sinjai

Cuestiones relacionadas