我只是想构建一个视图,但是我收到了以下错误:
System.InvalidOperationException:The 模型项传递到字典中 为null,但此字典需要 类型的非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日期保留为null,因为在提交时,它尚未被发送出去。我有其他类似的领域,例如totalCost等,但为了简单起见,我没有将它们包含在这里。如果我注释掉SentForRepair行,则视图将与其他信息完美显示。
如果有人能指出我如何解决这个错误,我会非常感激! :)
答案 0 :(得分:14)
在显示模板中,您需要检查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)%>
答案 1 :(得分:11)
我在这里找到了另一个解决方案。将值设置为可为空。
Telerik MVC Grid - problem with nullable DateTime property
@model System.DateTime?
@Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue,
new { data_datepicker = true });
答案 2 :(得分:6)
将日期时间的自定义编辑器模板从DateTime类型更改为nullable datetime类型(DateTime?)
@model System.DateTime?
@Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue,
new { @class = "text-box single-line", data_datepicker="true"})
答案 3 :(得分:1)
刚刚更改了FormDateShort模板,因此它接收了DateTime?而不是DateTime,并在渲染之前用一些逻辑来检查你是否有值。