【问题标题】:One to Many View - do I have to use a View Model?一对多视图 - 我必须使用视图模型吗?
【发布时间】:2017-08-01 17:34:10
【问题描述】:

假设我有这样的观点:

@model Models.CustomerModel

@{
    ViewBag.Title = "Details";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>Details</h2>

<div>
    @*<h4>ApplicationModel</h4>*@
    <hr />
    <dl class="dl-horizontal">
        <dt>
            @Html.DisplayNameFor(model => model.FirstName)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.FirstName)
        </dd>

        <dt>
            @Html.DisplayNameFor(model => model.Surname)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.Surname)
        </dd>
       </dl>
</div>

假设 CustomerModel 也有一个 Orders 集合。 Order 类如下所示:

public class Order {
public int OrderID {get; set; }
public datetime OrderDate {get; set; }

如何将客户喜欢的所有订单放在同一个视图上?我试过这个(在上面的代码下):

<table class="table">
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.OrderID)
        </th>
    <th>
            @Html.DisplayNameFor(model => model.OrderDate)
        </th>
    </tr>

@foreach (var item in model.Orders)
{
    <tr>
        <td>
            @Html.DisplayFor(item => item.OrderID)
        </td>
    <td>
            @Html.DisplayFor(item => item.Description)
        </td>
    </tr>
}

我得到的错误是:

参数字典包含参数的空条目 方法的不可为空类型“System.Int32”的“orderid” 'System.Web.Mvc.ActionResult Delete(Int32)'。

如果我删除第二段代码(针对每个循环),那么它可以正常工作。如何添加第二段代码?

【问题讨论】:

  • 使用foreach 是可以的。问题出在哪里?不行吗?
  • 您的标题与问题无关,也许我误解了一些东西。有什么问题?
  • @MegaTron,现在请看最后一段。
  • @jAC,现在请看最后一段。
  • 该错误与调用您的Delete() 方法有关(与您显示的代码无关)

标签: c# asp.net-mvc


【解决方案1】:

尝试添加空检查

@if(Model.Orders != null)
{
  foreach (var item in Model.Orders)
  {
      <tr>
          <td>
              @Html.DisplayFor(t => item.OrderID)
          </td>
      <td>
              @Html.DisplayFor(t => item.Description)
          </td>
      </tr>
  }
}

或者你可以使用 LINQ

if(Model.Orders.Any())

如果没有帮助,请查看this question

【讨论】:

  • 我得到的错误是:“CS0103:当前上下文中不存在名称'模型'”
  • 因为必须是Model
  • 哦,是的。使用“模型”而不是“模型”
  • @Html.DisplayFor(m =&gt; item.Description)。如果您的 lambda 已使用新的 item,则不能声明它。
  • @w0051977 =&gt;(这里是tm)之前的lambda部分声明了一个变量,它引用了Model,因为DisplayFor通常应该直接引用一些@ 987654333@(例如Html.DisplayFor(m =&gt; m.FirstName)。这是一种使DisplayFor 循环工作的解决方法。如果您对此不满意,只需使用Html.Display(item.Property)。请参阅:stackoverflow.com/questions/3419711/…
【解决方案2】:

您可以在 CustomerModel 中使 OrderId 为空

public int? OrderID {get; set; }

或者检查来自数据库的空值 OrderId(如果 OrderId 不应该为空,那么它是坏数据,应该从数据库本身限制)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-20
    相关资源
    最近更新 更多