对象引用未设置为View中对象的实例

时间:2015-06-08 07:40:57

标签: javascript asp.net-mvc razor

我在视图中有以下代码(在javascript中)

 console.log("@Model.Sides.SingleOrDefault(a => a.Name == "B").Surfaces.Count");

它抛出异常

  

对象引用未设置为对象的实例

如何抛出异常 - 没有发生任何事情?

5 个答案:

答案 0 :(得分:0)

在您的情况下,@Model.Sides中没有项目可能会出现这种情况 在这种情况下,您可以使用。

@if(Model.Sides.Any() && Model.Sides.SingleOrDefault(a => a.Name == "B").Any())
{
console.log("@Model.Sides.SingleOrDefault(a => a.Name == "B").Surfaces.Count");
}
else
{
console.log("0");
}

答案 1 :(得分:0)

您只需先检查对象是否已初始化。这个逻辑真的应该超出你的观点。

@{
    int count = 0;

    //Check the model isnt null first
    if (Model != null)
    {

        var side = Model.Sides.SingleOrDefault(a => a.Name == "B");

        if (side != null)
        {
            //You can perform null check on surfaces here as well
            count = side.Surfaces.Count;
        }

    }


}

<script>

    console.log("@count");

</script>

答案 2 :(得分:0)

您可以尝试以下

@if(Model.Sides.SingleOrDefault(a => a.Name == "B").Any())
{
console.log("@Model.Sides.SingleOrDefault(a => a.Name == "B").Surfaces.Count");
}
else
{
console.log("0");
}

答案 3 :(得分:0)

如果列表中不包含一个项目,

SingleOrDefault将返回null。

如果你的&#39;在哪里&#39;子句a.Name == 'B'不会返回一个项目,然后结果将为null。

因此,如果您的Sides列表中没有一个B&#39; B&#39; (即,没有或2或大于2),SingleOrDefault的结果将为空,.Surfaces将给出错误&#39;对象引用未设置为对象的实例。

如果您只想在一个B侧只需要计数为零,那么请使用:

console.log("@(Model.Sides.SingleOrDefault(a => a.Name == "B") ?? new Side { Surfaces = new List<Surface>() }).Surfaces.Count");

在哪里?表示:如果左侧部分为null,则返回此值而不是null 并创建一个带有空列表的虚拟Side,以便Surfaces.Count == 0

或者,使用变量:

@{
    var side = Model.Sides.SingleOrDefault(a => a.Name == "B");
    if (side == null) 
    {
        @:console.log("none")
    } 
    else 
    {
        @:console.log(@side.Surfaces.Count);
    }
}

作为一种更清洁的替代方案,您可以使用SelectMany()代替(未经测试):

Model.Sides.Where(a=>a.Name=="B").SelectMany(x=>x.Surfaces).Count()

那么您不必担心临时变量等,但会返回“表面”的数量&#39;对于所有人来说&#39; B&#39;双方,所以可能不是你的要求。

答案 4 :(得分:0)

On Catch(e)什么都不做:

这是通用的,可以抑制任何错误。用try catch包装你认为可能出错的代码,catch什么都不做。

但是这可能导致进一步的问题,只需要对空挡块保持谨慎。

例如:

try
  {
       //code that errors
  }

catch (e)
  {
      ;
  }

//Continue