Ошибка 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)%>
Ответ 2
Я нашел здесь другое решение. Устанавливает значение для значения NULL.
Telerik MVC Grid - проблема с нулевым значением свойства DateTime
@model System.DateTime?
@Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue,
new { data_datepicker = true });
Ответ 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 и вставить некоторую логику, чтобы проверить, что у вас есть значение перед рендерингом.