2015-06-08 4 views
0

Я следующий код в представлении (в JavaScript)объекта не задана ссылка на экземпляр объекта в View

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

он вызывает исключение

объекта не задана ссылка на экземпляр объект

Как это сделать, когда исключение выбрасывается - ничего не произошло?

ответ

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"); 
} 
+0

Вам нужно будет избежать console.log @ т.е: console.log ("0"); – heymega

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> 
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"); 
} 
0

SingleOrDefault возвращает нуль, если список не содержит ровно один элемент.

Если ваше предложение «где» a.Name == 'B' не возвращает ровно один элемент, тогда результат будет равен нулю.

Так что если в списке ваших сторон нет только одного «B» (т.е. нет ни одного или 2 или более 2), результат SingleOrDefault будет равен нулю, а .Surfaces предоставит ошибку «Ссылка на объект не установлена ​​на экземпляр объекта.

Если вы просто хотите, счетчик в ноль, когда не только одна сторона B, а затем использовать:

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

где ?? означает: если левая часть равна нулю, вернуть это вместо нулевой и создать фиктивный 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() 

, то вам не нужно беспокоиться о временных переменных и т.д., но будет возвращать число «поверхностей» для всех «B» сторон, поэтому может не быть вашим требованием.

0

улова (е) ничего не делать:

Это общее, что может подавлять любую ошибку. Оберните код, который, по вашему мнению, может ошибиться при попытке поймать, а уловка ничего не делает.

Но это может привести к дальнейшим проблемам, просто будьте осторожны с пустым блоком улова.

например:

try 
    { 
     //code that errors 
    } 

catch (e) 
    { 
     ; 
    } 

//Continue 
Смежные вопросы