asp.net mvc problem z kontrolerem

asp.net mvc problem z kontrolerem
D9
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 16
0

Cześć, w ramach nauki asp.net mvc próbuję napisać sklep internetowy i tutaj mały problem.
Na stronie głównej strony są do wyboru kategorie, po kliknięciu w daną kategorię ma usera przenieść na podstronę gdzie będą wszystkie produkty z danej kategorii (coś w stylu allegro). screenshot-20181104125441.png

Stworzyłem sobie kontroler Produkty , gdzie jest akcja:

Kopiuj
 public ActionResult Lista(string nazwaKategorii)
        {
            var kategoria = db.Kategorie.Include("Produkty").Where(p => p.NazwaKategorii.ToUpper() == nazwaKategorii.ToUpper()).Single();

             var produkty = kategoria.Produkty.ToList();
             return View(produkty);
           
        }

W stworzonym HomeViewModel :

Kopiuj
 public class HomeViewModel
    {
        //tworzymy 3 listy dla kategorii, nowosci i bestselerów

        public IEnumerable<Kategoria> Kategorie { get; set; }
        public IEnumerable<Produkt> Nowosci { get; set; }
        public IEnumerable<Produkt> Bestselery { get; set; }
    }
}

Stosowałem przy tworzeniu bazy podejście code-first. Model kategoria wygląda tak:

Kopiuj
  public partial class Kategoria
    {
        
    
        public int KategoriaId { get; set; }
        public string NazwaKategorii { get; set; }
        public string OpisKategorii { get; set; }
        
        public virtual ICollection<Produkt> Produkty { get; set; }
     
    }

Same kategorie się pojawiają , ale jak chcę zwrócić return(produkty) w kontrolerze Produkty to wyrzuca mi błąd jak w screenie. Co robię źle?
screenshot-20181104130540.png

neves
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Kraków
  • Postów: 1114
0

Błąd jest w tej linijce

Kopiuj
  return View(produkty);

zwracasz czystą listę, a trzeba zwrócić instancję HomeViewModel

Kopiuj
 return View(new HomeViewModel() {Bestselery  = produkty });
D9
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 16
0

Ok zrobiłem tak jak podajesz tylko teraz mam błąd w widoku:

Kopiuj

@{
    ViewBag.Title = "Kategorie";
    Layout = "~/Views/Shared/_Layout.cshtml";
}
@Html.Action("KategorieMenu")
@Html.Partial("_ProduktyList")

Próbuję to wyrzucić Html.Partial i wtedy komunikat :
screenshot-20181104133222.png

Coś jeszcze trzeba tutaj rzutować albo używam złej metody ?

WeiXiao
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5226
0
Dani12.95 napisał(a):

Ok zrobiłem tak jak podajesz tylko teraz mam błąd w widoku:

Kopiuj

@{
    ViewBag.Title = "Kategorie";
    Layout = "~/Views/Shared/_Layout.cshtml";
}
@Html.Action("KategorieMenu")
@Html.Partial("_ProduktyList")

Coś jeszcze trzeba tutaj rzutować albo używam złej metody ?

Dodaj u góry we Widoku (cshtml)

Kopiuj
@model namespace_twojego_modelu_HomeViewModel
D9
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 16
0

Tak dodałem namespace ale i tak
screenshot-20181104134734.png

SZ
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1591
0

No na widoku deklarujesz modele a przekazujesz ViewModele i tu jest chyba problem.
Ważne jest co masz w widoku @model a co przekazujesz.

szalonyfacet
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Dąbrowa Górnicza
1

Blad jasno mowi ze przesylasz ....HomeViewModel do widoku, ale w widoku jest zadeklarowane poprzez @model zeby przyjmowac liste produktow.

wiec w widoku glownym musisz miec u gory: @model ShopApp.ViewModels.HomeViewModel a w widoku czesciowym (partialView) dobrze przyjmowac tylko liste produktow, wiec w partialu na gorze ustaw @model IEnumerable<Produkt> choc warto sie pokusic o stworzenie View Modelu dla tego czesiowego widoku takze zeby pozbyc sie referencji do encji. No i teraz wywolujesz partial view poprzez doanie drugiego parametru: @Html.Partial("_ProduktyList", Model Bestselery) lub zamiast Besteslerow daj: Model.Produktyw zaleznosci co chcesz tam wyslac bo jesli nie dodasz drugiego parametru to on domyslnie wysle model bazowy z danego widoku czyli w Twoim przypadku HomeViewModeli teoretycznie tez wyciagniesz z tego liste produktow potem ale po co pchac caly model bazowy jak potrzebuejsz stricte listy.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.