2011-01-28 12 views
10

Sto solo cercando di costruire una visione, ma sto ottenendo il seguente errore:MVC errore: L'elemento del modello passato nel dizionario è nullo

System.InvalidOperationException: The model item passed into the dictionary is null, but this dictionary requires a non-null model item of type 'System.DateTime

Ora, io so perché questo è in arrivo, il campo particolare nella banca dati è null, tuttavia dovrebbe essere, in quanto questo è qualcosa che viene modificato in un secondo momento. Qui è il mio codice:

azione

public ActionResult View(Int64? Id) 
    { 

     ModelContainer ctn = new ModelContainer(); 
     var item = from t in ctn.Items where t.ItemID == Id select t; 
     return View(Item.First()); 
    } 

Vista principale

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Administrator.Master" Inherits="System.Web.Mvc.ViewPage<myApp.Data.Item>" %> 

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server"> 
    View 
</asp:Content> 

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> 

    <% Html.RenderPartial("Details", Model); %> 

</asp:Content> 

<asp:Content ID="Content3" ContentPlaceHolderID="Header" runat="server"> 
<h1>Details - <%= Model.MainItem %></h1> 
</asp:Content> 

Vista parziale

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<myApp.Data.Item>" %> 
<%@ Import Namespace="myApp.Supplier.Web.Extensions" %> 

    <fieldset> 

     <legend>Information</legend> 

     <div class="fieldset"> 

      <%= Html.LabelFor(m => m.MainItem)%> 
      <%= Html.DisplayFor(m => m.MainItem, "FormTextShort")%><br /> 
      <%= Html.LabelFor(m => m.Supplier.Name)%> 
      <%= Html.DisplayFor(m => m.Supplier.Name, "FormTextShort")%><br /> 
      <%= Html.LabelFor(m => m.ProductCode)%> 
      <%= Html.DisplayFor(m => m.ProductCode, "FormTextShort")%><br /> 
      <%= Html.LabelFor(m => m.Product.SubmissionDate)%> 
      <%= Html.DisplayFor(m => m.Product.SubmissionDate, "FormDateShort")%><br /> 
      <%= Html.LabelFor(m => m.Product.SentForRepair)%> 
      <%= Html.DisplayFor(m => m.Product.SentForRepair, "FormDateShort")%><br /> 
     </div> 

    </fieldset> 

In questo caso, la data x.Product.SentForRepair viene lasciata nulla, poiché al momento dell'invio non è stata ancora inviata. Ho altri campi come questo, ad es. totalCost, ecc. tuttavia per semplicità non li ho inclusi qui. Se commento le linee SentForRepair, la vista viene visualizzata perfettamente con le altre informazioni.

Sarei così grato se qualcuno potesse indicarmi la giusta direzione su come aggirare questo errore !! :)

risposta

14

All'interno della maschera di visualizzazione è necessario verificare la presenza di null (dopo averlo fortemente tipizzato a DateTime?):

<% if (Model.HasValue) { %> 
    <%= Html.Encode(Model.Value.ToString("yyyy-MM-dd")) %> 
<% } %> 

o se si voleva fornire semplicemente un formato di data personalizzato si potrebbe rimuovere il display FormDateShort template e decorare la vostra proprietà vista del modello con l'attributo [DisplayFormat]:

[DisplayFormat(NullDisplayText = "", DataFormatString = "{0:yyyy-MM-dd}")] 
public DateTime? SentForRepair { get; set; } 

e poi semplicemente:

<%= Html.DisplayFor(m => m.Product.SentForRepair)%> 
+0

Ciao Darin, grazie ancora una volta per un altro buon risposta :) Solo un domanda veloce, seguendo questa vista, ho intenzione di consentire all'utente di fare clic su un pulsante Modifica che lo porta a una vista in cui può inserire nei dati mancanti. Pensi che avrò gli stessi problemi in quella vista quando sto provando a visualizzare le caselle di testo EditorFor? – 109221793

+0

Inoltre, solo un po 'più di informazioni, Il modello proviene direttamente dal database, non è un viewmodel, quindi non sarei sicuro di come implementare l'attributo [DisplayFormat()] sopra. – 109221793

+0

@ 109221793, riguardo alla tua prima domanda, non capisco davvero cosa stai chiedendo.Per quanto riguarda la seconda domanda, beh, non importa da dove vengono i tuoi modelli, dovresti sempre usare i modelli di visualizzazione. –

1

Hai appena modificato il modello FormDateShort in modo che richieda un valore DateTime? piuttosto che un DateTime e mettere in qualche logica per verificare che hai un valore prima del rendering.

6

Modifica il modello Editor personalizzato per datetime dal tipo DateTime al tipo nullable DateTime (DateTime?)

@model System.DateTime? 

@Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue, 
         new { @class = "text-box single-line", data_datepicker="true"}) 
Problemi correlati