Ошибка MVC: элемент модели, переданный в словарь, равен нулю

Я просто пытаюсь создать представление, но получаю следующую ошибку:

System.InvalidOperationException: элемент модели, переданный в словарь имеет значение null, но для этого словаря требуется ненулевой элемент модели типа "System.DateTime

Теперь, я знаю, почему это происходит, конкретное поле в базе данных равно null, однако оно должно быть, поскольку это то, что редактируется позднее. Вот мой код:

Действие

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());
    }

Основной вид

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

Частичный вид

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

В этом случае дата x.Product.SentForRepair остается пустой, поскольку на момент ее отправки она еще не отправлена. У меня есть другие поля, подобные этому, например. totalCost и т.д. Однако для простоты я не включил их здесь. Если я прокомментирую строки SentForRepair, представление отлично отобразится с другой информацией.

Я был бы так благодарен, если бы кто-нибудь мог указать мне в правильном направлении, как обойти эту ошибку!:)

Ответ 1

Внутри шаблона отображения вам нужно проверить значение null (после того, как он сильно набрал значение DateTime?):

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

или если вы хотите просто предоставить собственный формат даты, вы можете удалить шаблон отображения FormDateShort и украсить свое свойство модели просмотра атрибутом [DisplayFormat]:

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

а затем просто:

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

Ответ 3

Измените свой собственный шаблон редактора для даты и времени из типа DateTime, чтобы ввести значение nullable datetime (DateTime?)

@model System.DateTime?

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

Ответ 4

Просто изменил шаблон FormDateShort так, чтобы он принял DateTime? а не DateTime и вставить некоторую логику, чтобы проверить, что у вас есть значение перед рендерингом.