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:
> 
```csharp
@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/[...]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:

```csharp
@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?

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