【问题标题】:How to handle null child Entities in MVC Razor如何在 MVC Razor 中处理空子实体
【发布时间】:2011-08-13 06:13:36
【问题描述】:

我有一个迭代 Orders 集合的 MVC 剃刀视图。每个订单都有一个 Customer,可以为 null。

麻烦的是,在这种情况下,我得到一个空引用异常。

@foreach (var item in Model) {
<tr>
        <td>
        @Html.ActionLink("Edit", "Edit", new { id=item.ID }) |
        @Html.ActionLink("Delete", "Delete", new { id=item.ID })
    </td>
    <td>
        @item.Number
    </td>
    <td>
        @String.Format("{0:g}", item.ReceivedDate)
    </td>
    <td>
        @item.Customer.Name
    </td>

@item.Customer.Name 在 item.Customer 为空时爆炸(如您所料)。

这一定是一个简单的问题,但一直找不到答案!

在不设置 ViewModel 的情况下,最好的解决方法是什么?

谢谢 邓肯

【问题讨论】:

    标签: asp.net entity-framework asp.net-mvc-3 razor


    【解决方案1】:

    尝试以下方法:

    <td>        
        @(item.Customer != null ? item.Customer.Name : "")
    </td>
    

    编辑:封闭以确保它可以在 Razor 中工作。

    【讨论】:

    • 这在剃刀视图中不起作用。如果你附上它,那么它应该。 @(item.Customer != null ? item.Customer.Name : "")
    • @mr-grok - 感谢您的反馈。我是凭记忆写的,但我会编辑和更新我的帖子以反映正确的语法。
    【解决方案2】:

    首先,如果您要使用 for 迭代而不是 foreach,您可以使用内置的 html 帮助器 Html.DisplayFor(m =&gt; m[i].Customer.Name)。但这几乎没有缺点。您可能没有索引器集合属性和 DisplayFor 方法获取表达式参数并编译它,这是昂贵的。

    您可以创建自己的方法来代替它们来更好地处理这种情况,如下所示。

    public static class Utility
    {
        public static TValue NullSafe<T,TValue>(this T obj,Func<T,TValue> value)
        {
            try
            {
                return value(obj);
            }
            catch (NullReferenceException/*Exception can be better choice instead of NullReferenceException*/)
            {
                return default(TValue);
            }
        }
    }
    

    现在你可以愉快地使用它了

    @item.NullSafe(m=>m.Customer.Name)
    

    将 NullSafe 方法设为扩展或静态是您的选择。

    【讨论】:

      【解决方案3】:

      一个简单的 if 就可以完成这项工作:

      <td>
          @if (item.Customer != null)
          {
              <text>@item.Customer.Name</text>
          }
      </td>
      

      话虽如此,这只是一种解决方法。真正的解决方案在于定义和使用特定的视图模型。

      【讨论】:

        【解决方案4】:

        不确定如何构建这些对象,但另一种处理方法是使用 Null Object 设计模式,这将消除进行测试的需要并允许您为名称输出有意义的文本(“Unknown”、“ ",什么都没有)

        http://sourcemaking.com/refactoring/introduce-null-object

        【讨论】:

          【解决方案5】:
          @foreach (var item in Model.Where(item => item.Customer != null))
          

          【讨论】:

            猜你喜欢
            • 2013-07-15
            • 1970-01-01
            • 2012-03-30
            • 1970-01-01
            • 2012-02-16
            • 2013-06-20
            • 1970-01-01
            • 1970-01-01
            • 2012-11-10
            相关资源
            最近更新 更多