asp.net mvc problem z kontrolerem

Odpowiedz Nowy wątek
2018-11-04 13:04

Rejestracja: 3 lata temu

Ostatnio: 2 miesiące temu

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

edytowany 1x, ostatnio: Dani12.95, 2018-11-04 13:05

Pozostało 580 znaków

2018-11-04 13:17

Rejestracja: 16 lat temu

Ostatnio: 3 godziny temu

Lokalizacja: Kraków

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 });

It's easy to hate code you didn't write, without an understanding of the context in which it was written.

Pozostało 580 znaków

2018-11-04 13:32

Rejestracja: 3 lata temu

Ostatnio: 2 miesiące temu

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 ?

Pozostało 580 znaków

2018-11-04 13:36

Rejestracja: 4 lata temu

Ostatnio: 3 minuty temu

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
edytowany 6x, ostatnio: WeiXiao, 2018-11-04 13:40

Pozostało 580 znaków

2018-11-04 13:47

Rejestracja: 3 lata temu

Ostatnio: 2 miesiące temu

0

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

Pozostało 580 znaków

2018-11-04 14:07

Rejestracja: 6 lat temu

Ostatnio: 1 godzina temu

Lokalizacja: Nowa Ruda

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.

edytowany 1x, ostatnio: szydlak, 2018-11-04 14:09

Pozostało 580 znaków

2018-11-04 17:20

Rejestracja: 7 lat temu

Ostatnio: 1 dzień temu

Lokalizacja: Dąbrowa Górnicza

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.

Dziękuję Ci bardzo ! brakowało tego dodatkowe parametru w @Html.Partial . Z tym dodatkowym parametrem wszystko działa jak należy. - Dani12.95 2018-11-05 18:56

Pozostało 580 znaków

Odpowiedz

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