【问题标题】:How to fix ' Cannot perform runtime binding on a null reference"如何修复“无法对空引用执行运行时绑定”
【发布时间】:2018-11-29 18:17:57
【问题描述】:

我正在处理 MVC 项目,我正在循环一些值,有时其中一些值为空:

我能写什么,我怎么写??运算符或在@Item.User_class.User1.Nickname 为空的情况下设置一些默认值。

代码:

@foreach (var item in ViewBag.nextClassesList)
{ 
    <tr class="@item.Status">
        <td>@item.ClassDate</td>
        <td>@item.User_Class.User1.NickName ? @item.User_Class.User.NickName   </td>
        <td>@item.User_Class.ClassType.ClassTypeName.Name (@item.User_Class.ClassType.ClassTypeName.Time min)</td>
    </tr>
}

所以这行是问题:

<td>@item.User_Class.User1.NickName ? @item.User_Class.User.NickName   </td>


<td>@item.User_Class.User1.NickName </td> Is null sometimes...

【问题讨论】:

  • 为什么不创建一个扁平化的视图模型,在控制器操作方法中填充新的视图模型,并在那里而不是在视图中进行所有的空检查?目前,您的视图中最多有 3 个级别的空检查要做,这会变得很丑。
  • @Fran 我从朋友那里收到了这个项目。我需要解决这个问题,直到我为这个问题创建新的解决方案,这就是为什么我要问如何做到这一点?

标签: c# asp.net-mvc razor view ternary-operator


【解决方案1】:

对于作为@item 下的对象的每个属性,您需要执行空检查到一个简单的属性级别

(@item.User_Class == null) ? string.Empty : (@item.User_Class.User1 == null) ? (@item.User_Class.User == null) ? string.Empty : @item.User_Class.User.NickName :  @item.User_Class.User1.NickName 

您还需要检查 User 对象,因为它也可能为 null。

(@item.User_Class == null) ? string.Empty : (@item.User_Class.ClassTypeName == null) ? string.Empty : @item.User_Class.ClassTypeName.Name

在你的例子中

@foreach (var item in ViewBag.nextClassesList)
{ 
    <tr class="@item.Status">
        <td>@item.ClassDate</td>
        <td>(@item.User_Class == null) ? string.Empty : (@item.User_Class.User1 == null) ? (@item.User_Class.User == null) ? string.Empty : @item.User_Class.User.NickName :  @item.User_Class.User1.NickName</td>
...
}

语法可能有点不对,但你明白了。

【讨论】:

  • 谢谢!您能否发布示例并编辑我的示例(包括 for 循环等)。再次感谢
【解决方案2】:

您可以使用 C# 6.0 及更高版本中可用的 null 条件:

@item?.User_Class?.ClassTypeName?.Name

【讨论】:

  • 没错。一直是空检查。
  • 还是旧的方式(item.User_Class == null)? string.Empty : (item.User_Class.ClassTypeName == null) ? string.Empty : item.User_Class.ClassTypeName.Name;
  • @Fran 我说的是 item.User_Class.User1.NickName,但无论如何 :D 你能否发布示例作为答案,以便我接受它,因为你是第一个来到这里的人问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多