/ / Unexpected NullReferenceException in View - asp.net-mvc, asp.net-mvc-4, rasoir

Inattendu NullReferenceException dans la vue - asp.net-mvc, asp.net-mvc-4, rasoir

J'ai une vue Razor qui commence comme:

@using My.Models
@model MySpecificModel
@{
ViewBag.Title = "My Title";
// NullReferenceException here:
string dateUtc =
(Model == null ? DateTime.UtcNow.ToShortDateString() :
Model.Date.ToShortDateString());

Je ne vois aucune raison pour l'exception NullReferenceException dans la dernière ligne (remarque: l'élément "=?:" Figure sur une seule ligne de mon code source. Il est formaté pour s'adapter ici.)

Je retire ensuite la déclaration de / affectation à dateUtc et l'exception NullReferenceException passe à la ligne ViewBag.Title:

@using My.Models
@model MySpecificModel
@{
ViewBag.Title = "My Title";  // NullReferenceException here:

Comment cela peut-il arriver? ViewBag n'est bien sûr pas nul.

NOTE 1: Cela ne se produit que si Model est nul

NOTE 2: MySpecificModel.Date est de type DateTime et ne peut donc jamais être null.

Réponses:

3 pour la réponse № 1

Vous fournissez un modèle par défaut vide quirien. Ce sera juste pour que le modèle ne soit pas "nul". Il sera utile d’avoir une propriété IsEmpty. Mieux encore, si elle peut être appliquée dans votre cas, un modèle avec des valeurs par défaut. L’important est que le modèle ne soit jamais nul


4 pour la réponse № 2

Une exception NullReferenceException sur ViewBag.Title peut indiquer que l'erreur est vraiment sur une ligne proche. Dans cet exemple, l'erreur a été renvoyée à la ligne 1, mais l'erreur réelle est null. Model.Invoice à la ligne 3.

<h2>@ViewBag.Title</h2>
<div class="pull-right">
<button onclick="addInvoice("@Model.Invoice.InvoiceId");">Add Invoice</button>
</div>

De plus, ASP.NET MVC Razor ne gère pas les valeurs NULL dans les instructions ternaires comme le fait C #.

//Ternaries can error in Razor if Model is null
string date = (Model == null ? DateTime.Now : Model.Date);

//Change to
string date = null;
if (Model == null)
date = DateTime.Now;
else
date = Model.Date;

3 pour la réponse № 3

Vous obtiendrez une exception NULL si vous ne transmettez aucun modèle à la vue et que la vue reste liée à un modèle, par exemple:

@model MySpecificModel

Lorsque vous n'avez pas transmis un tel modèle à la vue de votre contrôleur.