C# MVC错误:传入字典的模型项为空

C# MVC错误:传入字典的模型项为空,c#,asp.net-mvc,model,view,C#,Asp.net Mvc,Model,View,我只是尝试构建一个视图,但出现以下错误: System.InvalidOperationException:异常 传递到字典中的模型项 为空,但此词典需要 类型为的非空模型项 'System.DateTime 现在,我知道了为什么会出现这种情况,数据库中的特定字段是空的,但是它应该是空的,因为这是以后编辑的内容。这是我的密码: 行动 public ActionResult View(Int64? Id) { ModelContainer ctn = new ModelC

我只是尝试构建一个视图,但出现以下错误:

System.InvalidOperationException:异常 传递到字典中的模型项 为空,但此词典需要 类型为的非空模型项 'System.DateTime

现在,我知道了为什么会出现这种情况,数据库中的特定字段是空的,但是它应该是空的,因为这是以后编辑的内容。这是我的密码:

行动

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>

看法
详情-
局部视图

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

问询处
m、 主要项目)%>
m、 MainItem,“FormTextShort”)%>
m、 供应商名称)%%> m、 供应商名称,“FormTextShort”)%>
m、 产品代码)%%> m、 ProductCode,“FormTextShort”)%>
m、 产品提交日期)%> m、 Product.SubmissionDate,“FormDateShort”)%>
m、 产品(用于维修)%> m、 Product.SentForRepair,“FormDateShort”)%>
在本例中,x.Product.SentForRepair日期保留为空,因为在提交时,它尚未发送出去。我还有其他类似的字段,例如totalCost等,但是为了简单起见,我没有将它们包括在这里。如果我注释掉SentForRepair行,视图将与其他信息一起完美显示


如果有人能为我指出正确的方向,告诉我如何避免这个错误,我将不胜感激!!:)

在显示模板内,您需要检查null(在将其强键入到
DateTime?
之后):

然后简单地说:

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

刚刚更改了FormDateShort模板,所以它需要一个日期时间?而不是DateTime,并在渲染前输入一些逻辑来检查是否有值。

我在这里找到了另一个解决方案。将值设置为可为空


将datetime的自定义编辑器模板从类型datetime更改为类型nullable datetime(datetime?)


嗨,Darin,再次感谢你的回答:)只是一个简单的问题,在这个视图之后,我打算允许用户点击一个编辑按钮,将他/她带到一个视图,在那里他/她可以输入缺少的数据。当我试图显示EditorFor文本框时,你认为我在该视图中会遇到同样的问题吗?另外,还有一点信息,该模型直接来自数据库,它不是viewmodel,因此我不确定如何实现上面的[DisplayFormat()]属性。@109221793,关于你的第一个问题,我真的不明白你在问什么。至于第二个问题,不管你的模型来自哪里,你都应该使用视图模型。我会采纳你的建议。视图模型。我在第一条评论中的意思是,在我原始问题的页面之后,我计划显示一个编辑页面,用户可以在其中编辑详细信息。在这个视图中,我必须显示空字段。我应该期待同样的错误吗?@109221793,如果你在显示模板中检查null,你应该不会有任何问题。
@model System.DateTime?

@Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue, 
    new { data_datepicker = true });
@model System.DateTime?

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