Problem z MVC , wyciaganie szczegolow produktu z bazy danych Widok - Kontroler

0

Cześć napotkałem kolejny problem przy nauce MVC ( próbuję stworzyć sklep internetowy).
Mam Kontroler "ProduktyController" , gdzie za pomoca akcji Szczegoly chcę przekazać z bazy danych odpowiednie informacje o szczegółach danego produktu.

public ActionResult Szczegoly(int id)
        {
            
            var prod = db.Produkty.Find(id);
            return View(prod);
            //return View();
        }

Dla przykładu:
http://localhost:51643/Produkty/Szczegoly/13 ma mi pokazać informacje o danym produkcie który ma ID 13

W momencie gdy chcę wywołać taki o to link jak wyżej otrzymuję błąd:
screenshot-20181118121746.png

HomeViewModel wygląda tak:


namespace ShopApp.ViewModels
{
    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; }
        public IEnumerable<Produkt> KategorieMenu { get; set; }
    }
}

W widoku mam użyty
@model ShoppApp.Models.Produkty

i następnie odwołuję się za pomocą Model.NazwaProduktu itp.. do tego co mam w bazie. Na czym moze tu polegać problem? Próbowałem różne sposoby i nadal ten błąd. Poniżej linki do całego kodu

ProdukTyContext: https://4programmers.net/Pastebin/9965
Szczegoly.cshtml: https://4programmers.net/Pastebin/9966
ProduktyController: https://4programmers.net/Pastebin/9967
HomeViewModel: https://4programmers.net/Pastebin/9968

1

A nie masz czasem tak, że masz dwa pliki Szczegoly.cshtml w różnych lokalizacjach ? I w folderze Produkty/Views masz ten niewłaściwy z HomeViewModel ?

0

Własnie mam tylko ten View w folderze Views/Produkty , gdzie w tym widoku mam równiez odwołanie do wyświetlenia kategorii. I one odwołują się do HomeViewModel. Może to jakoś koliduje?

0
Dani12.95 napisał(a):

Własnie mam tylko ten View w folderze Views/Produkty , gdzie w tym widoku mam równiez odwołanie do wyświetlenia kategorii. I one odwołują się do HomeViewModel. Może to jakoś koliduje?

lepiej może użyć do takiego wyświetlenia szczegolow produktu PartialView ? Albo jakaś propozycja jak to najlepiej zrobić?

0
Dani12.95 napisał(a):

Własnie mam tylko ten View w folderze Views/Produkty , gdzie w tym widoku mam równiez odwołanie do wyświetlenia kategorii. I one odwołują się do HomeViewModel. Może to jakoś koliduje?

No tego to już za bardzo nie rozumiem. W widoku szczegoly oprócz odwołania do Modelu masz jeszcze odwołanie do ViewModelu ? Coś namieszałeś. Pokaż cały kod widoku

0

W widoku masz mieć

@model ShopApp.Models.Produkt

I zwrócić obiekt typu ShopApp.Models.Produkt

Jeżeli chcesz zwracać dodatkowe rzeczy to masz kilka opcji:

  • Dodać ViewModel, który będzie zawierał produkt + dodatkowe rzeczy i zwracać ten model, a nie Produkt

  • Zwracać przez ViewData / ViewBag (mniej zalecane)

0
WeiXiao napisał(a):

W widoku masz mieć

@model ShopApp.Models.Produkt

I zwrócić obiekt typu ShopApp.Models.Produkt

Czyli tak jak teraz ma.

0
szydlak napisał(a):
Dani12.95 napisał(a):

Własnie mam tylko ten View w folderze Views/Produkty , gdzie w tym widoku mam równiez odwołanie do wyświetlenia kategorii. I one odwołują się do HomeViewModel. Może to jakoś koliduje?

No tego to już za bardzo nie rozumiem. W widoku szczegoly oprócz odwołania do Modelu masz jeszcze odwołanie do ViewModelu ? Coś namieszałeś. Pokaż cały kod widoku

https://4programmers.net/Pastebin/9966

w linku jest cały widok. Chodzi o to ze odwołuję się do @html.Action("KategorieMenu") , które zrobiłem wcześniej i tam mam kategorie produktów.

0

To nie ma znaczenie jeśli metoda KategorieMenu wysyła do widoku odpowiedni model czyli listę kategorii i ten widok ma zdefiniowaną chęć użycia takiego model @model IEnumerable<Kategoria>.
Pokaz jeszcze widok _KategorieMenu a najlepiej wrzuć całość do githuba.

Na początek mi się mocno nie podoba twój HomeViewModel. Wyświetlenie kategorii, nowości itp można właśnie załatwić @html.Action(...) w widoku Home i odpowiednimi metodami w odpowiednich kontrolerach z odpowiednimi widokami partial.

Np to public ActionResult KategorieMenu() nie powinno być w kontrolerze produktów tylko kategorii menu i wstawiasz sobie to w widokach albo layoucie za pomocą Action.

Wciśnij Ctrl+F i wyszukaj w całym projekcie HomeViewModel.

0

Wytłumacz jeszcze sens tej metody z kontrolera Produkty

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


            var produkty = kategoria.Produkty.ToList();
            //return View(produkty);
            return View(new HomeViewModel() { KategorieMenu = produkty });
           // var prod = db.Produkty.Where(p => p.Kategoria.ToString() == nazwaKategorii);
              
           //return View(produkty);
        }
0

ta "lista" ma za zadanie wyświetlać odpowiednie produkty z danej kategorii gdy są równe nazwie kategorii którą wybierze user klikając w dane hiperłącze. Wiem, że pewnie tam jest duzo namieszane ale dopiero co zaczynam z asp.netem także dzięki za wyrozumiałość i mam nadzieję , ze pomożecie mi rozwiązać ten problem z szczegółami produktu
Wrzuciłem na bitbuckets. Link na dole:
git clone https://[email protected]/dasch95/shop_db.git

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