2011-01-28 50 views
10

我只是试图建立一个看法,但我发现了以下错误:MVC错误:传递到字典的模型项目是空

System.InvalidOperationException: The model item passed into the dictionary is null, but this dictionary requires a non-null model item of type '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日期保留为空,因为在提交时它还没有被发送。我还有其他类似的领域,例如总成本等,但为了简单起见,我没有把它们包括在这里。如果我将SentForRepair行注释掉,视图将与其他信息完美地一起显示。

如果有人能指出我正确的方向来解决这个错误,我会非常感激! :)

回答

14

里面你需要检查空(使它强类型到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)%> 
+0

嗨达林,谢谢快速的问题,按照这个观点,我打算让用户点击一个编辑按钮,让他/她看到他可以输入缺失的数据。当我试图显示EditorFor文本框时,您认为我在该视图中会遇到同样的问题吗? – 109221793 2011-01-28 11:26:01

1

刚刚更改了您的FormDateShort模板,因此需要使用DateTime?而不是一个DateTime,并放入一些逻辑来检查您在渲染之前是否有值。

6

变化从DateTime类型的日期时间您的自定义编辑模板,再次为另一个很好的答复:)只是一个类型为空的日期时间(日期时间?)

@model System.DateTime? 

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