[ASP.NET CORE] Problem z pobieraniem danych w DropDownList

0

Witam Wszystkich,
jestem początkującym C# a dokładnie z ASP.NET CORE Entity framework. W celu nauki postanowiłem zrobić aplikację do obsługi myjni samochodowej. Generalnie utknąłem na prostej rzeczy.

Na stronie mam wyświetlane dwa dropdownlist

title

do których przekazuję wartości po przez controller

[HttpGet]
        public async Task<IActionResult> Home()
        {

            Data.Events = await _context.Events.ToListAsync();
            Data.WorkHours = await _context.WorkHours.ToListAsync();
            Data.CarManufactures = await _context.CarManufacture
                                                            .Include(p => p.CarModels)
                                                            .ToListAsync();
            Data.Detections = _detection;

            return View(Data);
        }

Model CarManufacture :

 public class CarManufacture
    {
        public int ID { get; set; }
        public string CarManufactureName { get; set; }
        
        public ICollection<CarModel> CarModels { get; set; }
    }

Model CarModel :

 public class CarModel
    {
        public int CarModelID { get; set; }
        public int CarManufactureID { get; set; }
        public string Models { get; set; }
        public bool Kombi { get; set; }

        public CarManufacture CarManufacture { get; set; }
    }

Razor View (część kodu) :

 <div class="col-3">
                    <div class="event-wrapper">
                        <div class="event-wrapper-header">Dodaj Klienta</div>
                        <div class="content">
                            <div class="head">Wybierz markę samochodu</div>
                            <div class="car-picker-wrapper">
                                <div class="select">
                                    <select>
                                        @foreach (var item in Model.CarManufactures.OrderBy(o => o.CarManufactureName))
                                        {
                                            <option value="@item.ID">@Html.DisplayFor(modal => item.CarManufactureName)</option>
                                        }
                                    </select>
                                </div>
                            </div>
                            <div class="head">Wybierz model samochodu</div>
                            <div class="car-picker-wrapper">
                                <div class="select">
                                    <select id="SecondDropdown">
                                        @foreach (var items in Model.CarManufactures)
                                        {
                                           Tutaj ma generować listę z modelami
                                        }
                                    </select>
                                </div>
                            </div>

Model Data:

 public class Data
    { 
        public List<Event> Events { get; set; }
        public List<WorkHours> WorkHours { get; set; }
        public IDetection Detections { get; set; }
        public List<CarManufacture> CarManufactures { get; set; }

        private static int _startDate = 0;

        public int StartingDate
        {
            get { return _startDate; }

            set
            {
                if (value == 0) _startDate = 0; // To set Home
                _startDate = _startDate - value;
            }
        }
    }

Home.cshtml

@using CarWash.Models
@using System;
@model CarWash.Models.Data

@{
    Layout = null;
}

Widok w trakcie debugowania:
title

Podczas debugowania widzę, że do widoku przekazuję w DATA , CarModels jako listę. Ale nie wiem czemu nie potrafię z tej listy wydobyć modeli :/. I tutaj moja prośba o podpowiedź gdzie robię błąd albo jak dobrać się do tej listy.

Z góry dziękuje

0

Generalnie wzorowałem się na tym tutorialu https://docs.microsoft.com/pl-pl/aspnet/core/data/ef-rp/intro?view=aspnetcore-2.1&tabs=visual-studio. I jak dobrze zrozumiałem to

public CarManufacture CarManufacture { get; set; }

jest punktem nawigacyjnym pomiędzy modelem CarManufacture a CarModel. Generalnie wszystkie dane pobieram z BazySql.

mam dodatkowo utworzony model Data do, którego przekazuje z controllera jako listę WorkHours ,Events następnie w widoku Razor

@model carwash.model.data

Później jak będe miał odpalony visual to przekopiuje model DATA oraz dokładnie deklarację @model w widoku.

0

Jaki typ dla modelu masz ustawiony w widoku?

0

@somekind: Nie wiem czy dobrze Ciebie zrozumiałem ale w widoku mam zwykły model ( nie IEnumerable<>, ICollection )

public class Data
    { 
        public List<Event> Events { get; set; }
        public List<WorkHours> WorkHours { get; set; }
        public IDetection Detections { get; set; }
        public List<CarManufacture> CarManufactures { get; set; }
 
        private static int _startDate = 0;
 
        public int StartingDate
        {
            get { return _startDate; }
 
            set
            {
                if (value == 0) _startDate = 0; // To set Home
                _startDate = _startDate - value;
            }
        }
    }

gdyż potrzebowałem przekazać do widoku większą ilość modeli. Następnie w widoku mam

@using CarWash.Models
@using System;
@model CarWash.Models.Data
 
@{
    Layout = null;
}
0

A swoją drogą, skoro dropdowna generujesz sam, to po co Ci w ogóle to @Html.DisplayFor(modal => item.CarManufactureName)? Przecież wystarczy @item.CarManufacturerName.

0

Rozwiązanie proste jak budowa cepa ;). Trzeba było zastosować dwa razy foreach.

                                   <select>
                                        @foreach (var carManufacture in Model.CarManufactures.OrderBy(o => o.CarManufactureName))
                                        {
                                            @foreach (var carModel in carManufacture .CarModels)
                                            {

                                                <option>@carModel.Models</option>
                                            }
                                        }
                                    </select>

Dziękuje za zainteresowanie i temat można zamknąć.

0
shigo napisał(a):

Rozwiązanie proste jak budowa cepa ;). Trzeba było zastosować dwa razy foreach.

(...)

Nic tak nie uczy programować jak debugowanie błędów z książek i tutoriali :D

0

Moim zdaniem powinno się użyć gotowego helpera na dropdownlista, a nie foreachować to.

1 użytkowników online, w tym zalogowanych: 0, gości: 1