Ошибка MVC: элемент модели, переданный в словарь, является нулевым - PullRequest
11 голосов
/ 28 января 2011

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

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, представление будет отлично отображаться с другой информацией.

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

Ответы [ 4 ]

14 голосов
/ 28 января 2011

Внутри шаблона отображения вам нужно проверить наличие нуля (после того, как он строго набрал 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)%>
11 голосов
/ 08 мая 2011

Я нашел другое решение здесь.Установите значение равным нулю.

Telerik MVC Grid - проблема со значением свойства DateTime, допускающим нулевое значение

@model System.DateTime?

@Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue, 
    new { data_datepicker = true });
6 голосов
/ 17 мая 2012

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

@model System.DateTime?

@Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue,
                      new { @class = "text-box single-line", data_datepicker="true"})
1 голос
/ 28 января 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...