Member 13238849 Ответов: 1

Asp.net -ссылка на объект не установлена на экземпляр объекта


Я пытаюсь создать представление, в котором пользователь может видеть сделанные им заказы. В основном у меня есть модель, которая содержит список из 2 различных видов бронирований в разных помещениях, зале и комнате. Таким образом, модель содержит список бронирований залов и список бронирований номеров. В моем контроллере я пытаюсь добавить все заказы зала в список заказов зала, и то же самое для заказов номеров. Но я получаю эту ошибку

Цитата:
"Ссылка на объект не установлена на экземпляр объекта."


Вот моя модель:

public class AllBookingsViewModel
{

    public List<HallActivityBooking> HallBookingsList { get; set; }

    public List<RoomBooking> RoomBookingsList { get; set; }

}


Вот мой контроллер:

public class BookingsController : BaseController
{
    // GET: Bookings
    public ActionResult Bookings()
    {

        //Get current user
        var userId = User.Identity.GetUserId();
        var currentUser = db.Users.Find(userId);

        AllBookingsViewModel model = new AllBookingsViewModel();

        //Fill activity booking
        foreach (HallActivityBooking hallBooking in db.HallBookings.Where(x => x.CustomerUser.Id == currentUser.Id))
        {
            model.HallBookingsList.Add(hallBooking);
        }


        //Fill room bookings list
        foreach (RoomBooking roomBooking in db.RoomBookings.Where(x => x.CustomerUser.Id == currentUser.Id))
        {
            model.RoomBookingsList.Add(roomBooking);
        }

        return View(model);
    }



Помощь будет оказана.

Что я уже пробовал:

Я попытался объявить модель такой:

var model = new AllBookingsViewModel


Я попытался добавить "FirstOrDefault" в оператор linq:

foreach (HallActivityBooking hallBooking in db.HallBookings.Where(x => x.CustomerUser.Id == currentUser.Id).FirstOrDefault())
{
    model.HallBookingsList.Add(hallBooking);
}


Это дает мне эту ошибку:

Цитата:
Описание Кода Серьезности Состояние Подавления Строки Файла Проекта
Ошибка CS0446 Foreach не может работать с "группой методов". Вы намеревались вызвать "группу методов"? ... 26 активных

1 Ответов

Рейтинг:
2

Dave Kreskowiak

Почему вы делаете foreach в запросе, который может возвращать только null или один объект (этот FirstOrDefault)?

Вы получаете исключение NullReferenceException, потому что ваш код пытается вызвать метод или получить/установить свойство для объекта, который является нулевым. Вы не говорите, какая строка кода вызывает ошибку, но так как у вас есть foreach пытаясь перечислить запрос, который может возвращать только один объект или null, я буду считать, что эта строка выбрасывается.

FirstOrDefault возвращает первый объект в коллекции или, если коллекция пуста или равна нулю, возвращает значение по умолчанию для выражения. Для типов объектов это всегда null. Для типов значений обычно 0.

Поскольку ваше выражение запроса, по-видимому, не соответствовало ничему в предложении Where, вы пытаетесь сделать foreach на нуле, возвращаемом FirstOrDefault.


Member 13238849

Я больше не использую FirstOrDefault (). Это было просто то, что я пробовал, но оно даже не может скомпилироваться, если я его оставлю. Код контроллера, который я дал, таков, как он есть сейчас, я получаю ошибку в этой строке:

модель.HallBookingsList. Add(hallBooking);

Кажется, оператор linq в порядке

Dave Kreskowiak

Хорошо, HallBookingsList равен нулю. Вы создали экземпляр AllBookingsViewModel, но это свойство HallBookingsList не имеет экземпляра List< hallactivitybooking>. AllBooksingViewModel, вероятно, должен создавать экземпляры обоих своих свойств списка в своем конструкторе.

Да, и с помощью отладчика вы могли бы решить эту проблему сами за считанные секунды. NullReferenceExceptions легко отслеживаются в отладчике. Просто подождите, пока код остановится или установит точку останова, и начните наводить курсор мыши на имена переменных, чтобы увидеть их содержимое.

Member 13238849

Да я решил эту проблему:

AllBookingsViewModel model = новый AllBookingsViewModel();
{
модель.HallBookingsList = дБ.HallBookings.Где (x => x.CustomerUser.Id == currentUser.Id);
model.RoomBookingsList = db.RoomBookings.Где (x => x.CustomerUser.Id == currentUser.Id);
};