【问题标题】:ASP.NET MVC 4 - Cannot perform runtime binding on a null referenceASP.NET MVC 4 - 无法对空引用执行运行时绑定
【发布时间】:2020-11-21 20:58:29
【问题描述】:

我正在尝试在表格中输出玩家的统计数据。并非所有玩家都会根据当天的统计数据。我尝试了其他方法,但所有人仍在抱怨。这是我现在拥有的代码:

      <tbody>
            @foreach(var player in @ViewBag.Roster){
                int index = 0;
                <tr>
                    <td>@player.Name, @player.TeamName @player.Position</td>
                    if(@ViewBag.Stats[index] == null){
                        <td>--</td>
                        <td>--</td>
                        <td>--</td>
                        <td>--</td>
                    }
                    else{
                        <td>@ViewBag.Stats[index].Points</td>
                        <td>@ViewBag.Stats[index].Rebounds</td>
                        <td>@ViewBag.Stats[index].Assists</td>
                        <td>@ViewBag.Stats[index].Turnovers</td>                        
                    }
                </tr>
                index++;
            }

        </tbody>

异常详细信息:Microsoft.CSharp.RuntimeBinder.RuntimeBinderException:无法对空引用执行运行时绑定

来源错误:

第 32 行:}

第 33 行:否则{

第 34 行:@ViewBag.Stats[index].Points

第 35 行:@ViewBag.Stats[index].Rebounds

第 36 行:@ViewBag.Stats[index].Assists

【问题讨论】:

  • 无法理解您面临的问题是什么?
  • 我正在尝试检查每个玩家是否有统计数据。如果他们这样做,我会输出它。否则只输出'--'。也许有不同的语法来检查统计信息是否存在?
  • 是的!那行得通,但现在我的 index++ 不起作用。任何想法我应该把它放在哪里?它只是为我的所有玩家输出相同的统计数据。
  • 好吧,我不知道它是否解决了我最初的问题,即如果 stat 为空,则输出'--'。但是页面加载没有错误
  • 我已经发布了关于索引问题的答案..

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


【解决方案1】:

好的,我在这里发布完整的答案 -

  1. if(@ViewBag.Stats[index] == null){ 之前尝试@ 并从@ViewBag 中的if 中删除@,使其看起来像这样 - @if(ViewBag.Stats[index] == null){

  2. 您在foreach 中设置index = 0,因此在每个循环中都会对其进行初始化。像这样在foreach之外初始化它

    var index = 0; foreach ...

如果您遇到范围问题,试试这个 -

@{
    var index = 0;
    foreach (....) {
        .......
        index++
    }
}

【讨论】:

  • 太好了。非常感谢!
  • 太好了,这让我再次检查了我的 *.cshtml,我发现在我从另一个代码(使用 Razor 语法)复制/粘贴后不存在的模型的引用,比如' @Model.item' 在我的代码末尾。只是评论那行代码对我有用。
【解决方案2】:

如果您想跟踪索引,为什么不将循环重写为:

    var obj = new string[] { "", "", "" };

    for(var index = 0; index < obj.Length; index++)
    {
        var item = obj[index];

        /* DO STUFF WITH ITEM */
    }

    foreach(var item in obj.Select((value, index) => new { index, value }))
    {
        /* DO STUFF WITH item.Value */
    }

【讨论】:

    【解决方案3】:

    我尝试了上面建议的两种情况,但都没有运气。 最后我不得不在控制器的 Index 方法本身中初始化我的 ViewBag 集合。 所以当我做这样的事情时,

    var stringArray = new string[10] { "", "", "", "", "", "", "", "", "", "" };
    ViewBag.doc = stringArray;
    

    成功了。 (我有 10 个元素。如果它们更多,则必须为初始化做其他事情。) 我在视图部分的代码现在如下:

      @for (var itm =0; itm< 10; itm++)
                            {
                        <div class="form-group">
                            <label asp-for="Documents[itm].doc"></label>
                            <input type="file" asp-for="Documents[itm].doc" />
                            @if (ViewBag.doc[itm] != "")
                            {<a asp-area="" asp-page="/wwwroot/CaseDocuments/@ViewBag.doc[itm]">@ViewBag.doc[itm]</a>
                                <label asp-for="Documents[itm].remove"></label>
                                @Html.CheckBoxFor(a => a.Documents[itm].remove)
                            }
                        </div>
                                <div class="form-group">
                                    <label asp-for="Documents[itm].desc"></label>
                                    <textarea asp-for="Documents[itm].desc" class="form-control" rows="3"></textarea>
                                </div>
                            }
    

    【讨论】:

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