我在视图中有以下代码(在javascript中)
console.log("@Model.Sides.SingleOrDefault(a => a.Name == "B").Surfaces.Count");
它抛出异常
对象引用未设置为对象的实例
如何抛出异常 - 没有发生任何事情?
答案 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