2011-01-28 18 views
10

sólo estoy tratando de construir una vista, pero estoy recibiendo el siguiente error:MVC error: El elemento de modelo pasado en el diccionario es nula

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

Ahora, sé por qué esto se acerca, el campo particular en la base de datos es nulo, sin embargo se supone que es, ya que esto es algo que se edita en una fecha posterior. Aquí está mi código:

Acción

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 principal

<%@ 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 parcial

<%@ 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> 

En este En este caso, la fecha x.Product.SentForRepair se deja nula porque, en el momento del envío, aún no se ha enviado. Tengo otros campos como este, p. TotalCost, etc. Sin embargo, por simplicidad no los he incluido aquí. Si hago un comentario sobre las líneas de SentForRepair, la Vista se muestra perfectamente con la otra información.

¡Estaría tan agradecido si alguien pudiera orientarme en la dirección correcta sobre cómo evitar este error! :)

Respuesta

14

Dentro de la plantilla de visualización que necesita para comprobar nula (después de lo que es inflexible a DateTime?):

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

o si desea proporcionar simplemente un formato de fecha personalizada que podría quitar la pantalla FormDateShort plantilla y decorar su propiedad vista del modelo con el atributo [DisplayFormat]:

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

y luego simplemente:

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

Hola Darin, gracias una vez más por otra buena respuesta :) Sólo una pregunta rápida, siguiendo esta vista, tengo la intención de permitir que el usuario haga clic en un botón Editar que lo lleva a una vista donde puede ingresar los datos faltantes. ¿Crees que tendré los mismos problemas en esa vista cuando estoy tratando de mostrar el editor para cuadros de texto? – 109221793

+0

Además, solo un poco más de información, El modelo viene directamente de la base de datos, no es un modelo de vista, así que no estoy seguro de cómo implementar el atributo [DisplayFormat()] arriba. – 109221793

+0

@ 109221793, con respecto a su primera pregunta, realmente no entiendo lo que está preguntando.En lo que se refiere a la segunda pregunta, bueno, no importa de dónde vienen sus modelos, siempre debe usar los modelos de vista. –

1

¿Acaba de cambiar su plantilla FormDateShort para que tenga un DateTime? en lugar de un DateTime y poner algo de lógica para comprobar que tiene un valor antes de la representación.

6

Cambiar el editor de plantillas a medida para fecha y hora de tipo DateTime para escribir la fecha y hora anulable (DateTime?)

@model System.DateTime? 

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