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";
}
Другие вопросы по тегам