System.ArgumentNullException: значение не может быть нулевым. Имя параметра: источник
Здесь мой код показывает, что переданный вами параметр равен нулю:
[HttpPost]
public String Indexhome( IEnumerable<Seat> Seats )
{
if (Seats.Count(x => x.IsSelected) == 0)
{
return "you didnt select any seats";
}
else
{
StringBuilder sb = new StringBuilder();
sb.Append("you selected");
foreach (Seat seat in Seats)
{
if (seat.IsSelected)
{
sb.Append(seat.Name + " ,");
}
}
sb.Remove(sb.ToString().LastIndexOf(","), 1);
return sb.ToString();
}
}
2 ответа
Места будут нулевыми, если вы вызовете метод без сопоставления аргумента data / query. Вы должны также проверить это, например, так:
[HttpPost]
public String Indexhome( IEnumerable<Seat> Seats )
{
if ((Seats == null) || !Seats.Any(s => s.IsSelected))
{
return "you didnt select any seats";
}
else
{
return "you selected " + string.Join(", ", Seats.Where(s => s.IsSelected).Select(s => s.Name));
}
}
Исключение возникает потому, что, как уже упоминал Лусеро, Seats
является null
, В отличие от обычного метода вы не получите NullReferenceException
здесь, потому что Count
это метод расширения:
public static int Count(this IEnumerable<T> source)
{
if (source == null) throw new ArgumentNullException("source");
}
Итак, как вы видите, метод бросает ArgumentNullException
вместо NullReferenceException
если source
является null
,
В качестве сторонних не использовать Count
чтобы проверить, есть ли в вашей коллекции предметы, используйте Any
вместо этого, поскольку он не перечисляет всю коллекцию и возвращает, когда было найдено самое первое соответствующее условие.
РЕДАКТИРОВАТЬ: Если вы собираетесь использовать другой метод, который является нормальным методом экземпляра, вы получите NRE, однако:
Seats.DoSomething(); // throws NRE when Seats = null
Так что проверьте, если аргумент null
перед его использованием:
[HttpPost]
public String Indexhome( IEnumerable<Seat> Seats )
{
if (Seats == null || !Seats.Any(x=> x.IsSelected))
return "you didnt select any seats";
}