【问题标题】:MVC Error: The model item passed into the dictionary is nullMVC 错误:传入字典的模型项为空
【发布时间】:2011-06-17 04:30:45
【问题描述】:

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

System.InvalidOperationException: 模型项传入字典 为空,但本词典需要 类型的非空模型项 '系统.日期时间

现在,我知道为什么会出现这种情况,数据库中的特定字段 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 行,视图将与其他信息完美显示。

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

【问题讨论】:

    标签: c# asp.net-mvc model view


    【解决方案1】:

    将日期时间的自定义编辑器模板从 DateTime 类型更改为可为空的日期时间(DateTime?)

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

    【讨论】:

      【解决方案2】:

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

      Telerik MVC Grid - problem with nullable DateTime property

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

          在 Display 模板中,您需要检查 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)%>
          

          【讨论】:

          • 嗨达林,再次感谢您的另一个好答复 :) 只是一个简单的问题,按照这个视图,我打算允许用户点击一个编辑按钮,将他/她带到一个视图他可以输入缺失的数据。当我尝试显示 EditorFor 文本框时,您认为我在该视图中会遇到同样的问题吗?
          • 另外,再多一点信息,模型直接来自数据库,不是视图模型,所以我不确定如何实现上面的 [DisplayFormat()] 属性。
          • @109221793,关于你的第一个问题,我不太明白你在问什么。至于第二个问题,好吧,不管你的模型来自哪里,你都应该使用视图模型。
          • 将在船上接受该建议。视图模型。我在第一条评论中的意思是按照我原来问题中的页面,我计划显示一个编辑页面,用户可以在其中编辑详细信息。在此视图中,我将不得不显示空字段。我应该期待同样的错误吗?
          • @109221793,如果您在显示模板中检查 null,您应该没有任何问题。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-11-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-01-02
          • 2012-11-09
          • 1970-01-01
          相关资源
          最近更新 更多