2011-01-28 21 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"}) 
相關問題