Pobieranie danych z bazy do DropDownListFor

0

Mam problem przy pobieraniu danych z bazy do DropDownListFor. Proszę o wskazówki co jest źle. Dostaje taki błąd:
The model item passed into the dictionary is of type 'System.Data.Entity.Infrastructure.DbQuery1[SZ.Entities.Province]', but this dictionary requires a model item of type 'SZ.Models.RegisterModel'.`

AccountModels.cs:

public class RegisterModel
    {
        ....

        public string Name { get; set; }
        public List<SelectListItem> ProvinceList { get; set; }
        ...
    }

_RegisterSystem.cshtml:

@Html.DropDownListFor(m => m.Name, new SelectList(Model.ProvinceList, "Id", "Name"))

LoginSysController.cs:

public List<Province> ProvinceList = new List<Province>();
public ActionResult _RegisterSystem()
        {
            EFDbContext _context = new EFDbContext();

            var resultProvinces = from c in _context.Provinces
                                  where c.Name == null
                                  select c;
            
            return View(resultProvinces);

Entity Province.cs:

public class Province
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

EFDbContext.cs:

public class EFDbContext : DbContext
    {
        ....
        public DbSet<Province> Provinces { get; set; }
    }
0

masz zły Model przesyłany do widoku, widok oczekuje modelu innego a dostaje inny, tak w skrócie można to wytłumaczyć.
Czemu nie chcesz użyć ViewBag do DropDownListFor?

Sebastiano napisał(a):

AccountModels.cs:

public class RegisterModel
    {
        ....

        public string Name { get; set; }
        public List<SelectListItem> ProvinceList { get; set; } // tu chyba jest błąd winno być public List<Province> ProvinceList {get; set; } jak chcesz użyć poniższych właściwości
        ...
    }

_RegisterSystem.cshtml:

@Html.DropDownListFor(m => m.Name, new SelectList(Model.ProvinceList, "Id", "Name"))

Entity Province.cs:

public class Province
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }
1
szymon7500 napisał(a):

masz zły Model przesyłany do widoku, widok oczekuje modelu innego a dostaje inny, tak w skrócie można to wytłumaczyć.
Czemu nie chcesz użyć ViewBag do DropDownListFor?

Sebastiano napisał(a):

AccountModels.cs:

public class RegisterModel
    {
        ....

        public string Name { get; set; }
        public List<SelectListItem> ProvinceList { get; set; } // tu chyba jest błąd winno być public List<Province> ProvinceList {get; set; } jak chcesz użyć poniższych właściwości
        ...
    }

Po dokonaniu zmian niestety dalej ten sam błąd.
Z ViewBag nie korzystam bo nie jest to zalecane (silnie typizowany)

1

nie będę się wymądrzał na temat używania ViewBag-u, ponieważ nie jestem ekspertem. Ale ktoś to i po coś wymyślił - to czemu go nie używać. Nieważne.

Co Twojego problemu, to sama zmiana w List<Province> ... na pewno nie pomoże, gdyż jak pisałem jest problem z Modelem(Modelami); w Widoku używasz modelu RegisterModel a dane jakie chcesz przesłać są z modelu Province i tu występuje "konflikt".

Tu poniżej link, który Ci może pomóc

http://www.c-sharpcorner.com/UploadFile/ff2f08/multiple-models-in-single-view-in-mvc/

Ponadto jak już nie chcesz użyć ViewBag-a do wypełnienia DropDownListFor, to może lepszym rozwiązaniem będzie użycie Json-a.

1

Problem jest również przy samym pobieraniu danych. Tak jakby nie było połączenia z bazą. Poniżej screen:

1

public ActionResult _RegisterSystem()
        {
            EFDbContext _context = new EFDbContext();
            var resultProvinces = _context.Provinces.Where(c => c.Name == null).ToList(); // ==null albo !=null nie wiem co chciałes osiągnąc
            var provincesListItem = resultProvinces.Select(x => new SelectListItem { Text = x.Name, Value = x.Id.ToString() });
 
            return View(provincesListItem);
        } 

Spróbuj coś podobnego, bo w modelu RegisterModel masz liste: List<SelectListItem> ProvinceList, a przesyłasz selecta z bazy. To co zwracasz do widoku musi być typu SelectListItem

1
Progress napisał(a):

public ActionResult _RegisterSystem()
        {
            EFDbContext _context = new EFDbContext();
            var resultProvinces = _context.Provinces.Where(c => c.Name == null).ToList(); // ==null albo !=null nie wiem co chciałes osiągnąc
            var provincesListItem = resultProvinces.Select(x => new SelectListItem { Text = x.Name, Value = x.Id.ToString() });
 
            return View(provincesListItem);
        } 

Spróbuj coś podobnego, bo w modelu RegisterModel masz liste: List<SelectListItem> ProvinceList, a przesyłasz selecta z bazy. To co zwracasz do widoku musi być typu SelectListItem

Teraz przesyła się prawidłowo:) Załaczam screen z poprawnym wyświetleniem danych:

1

Radze jeszcze używać usinga do otwierania połączeń z baza, bo są one bardzo zasobożerne, wiec zostawianie ich otwartych jest kiepskim pomysłem :)

 
public ActionResult _RegisterSystem()
        {
            using(var _context = new EFDbContext())
            {
            var resultProvinces = _context.Provinces.Where(c => c.Name == null).ToList();
            var provincesListItem = resultProvinces.Select(x => new SelectListItem { Text = x.Name, Value = x.Id.ToString() });
 
            return View(provincesListItem);
            }
        }
1

To bardzo słuszna uwaga, dzięki za informacje:)

1
Progress napisał(a):

Radze jeszcze używać usinga do otwierania połączeń z baza, bo są one bardzo zasobożerne, wiec zostawianie ich otwartych jest kiepskim pomysłem :)

 
public ActionResult _RegisterSystem()
        {
            using(var _context = new EFDbContext())
            {
            var resultProvinces = _context.Provinces.Where(c => c.Name == null).ToList();
            var provincesListItem = resultProvinces.Select(x => new SelectListItem { Text = x.Name, Value = x.Id.ToString() });
 
            return View(provincesListItem);
            }
        }

Próbuje teraz przesłać wynik do DropDownList:

@Html.DropDownList("id", (IEnumerable<SelectListItem>)ViewBag.ResultProvince, "--Wybierz województwo--")

lub tak:

@Html.DropDownList("id", ViewBag.ResultProvince as SelectList)

Ale cały czas są kompilkacje przy 2 modelach. Nie ma na to jakiegoś prostszego sposobu?

0

A nie wystarczy jak dasz w modelu

public virtual List... 

?

1

@Sebastiano, źle używasz ViewBag-a przykładów wypełniania DropDownListFor przy pomocy ViewBag-a są setki w Internecie.

A propos jeszcze użycia modelu do DropDownListFor:

http://www.c-sharpcorner.com/UploadFile/deveshomar/ways-to-bind-dropdown-list-in-Asp-Net-mvc/

Metoda 2.

Niestety, nie sprawdziłem jeszcze, ale tak "na oko" może zadziałać.

pozdrawiam

1
szymon7500 napisał(a):

@Sebastiano, źle używasz ViewBag-a przykładów wypełniania DropDownListFor przy pomocy ViewBag-a są setki w Internecie.

A propos jeszcze użycia modelu do DropDownListFor:

http://www.c-sharpcorner.com/UploadFile/deveshomar/ways-to-bind-dropdown-list-in-Asp-Net-mvc/

Metoda 2.

Niestety, nie sprawdziłem jeszcze, ale tak "na oko" może zadziałać.

pozdrawiam

Problem rozwiązany. Dziękuje wszystkim za pomoc i cierpliwość:) Poniżej działająca wersja:

@Html.DropDownList("ResultProvince", ViewBag.ResultProvince as SelectList)

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