asp.net mvc problem z kontrolerem

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:

 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 :

 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:

  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

0

Błąd jest w tej linijce

  return View(produkty);

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

 return View(new HomeViewModel() {Bestselery  = produkty });
0

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


@{
    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 ?

0
Dani12.95 napisał(a):

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


@{
    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)

@model namespace_twojego_modelu_HomeViewModel
0

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

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.

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.

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