przekazanie danych z jednego kotrolera do drugiego

0

Witajcie,
chcę zapisać pewne dane do bazy danych ale korzystając z dwóch formularzy, modeli, itd., która metoda jest lepsza

Pierwszy Controler

[HttpGet]
public ActionResult Product (int id = 0)
{
     ......
}

[HttpPost]
public ActionResult Product (Product product)
{ 
     if(ModelState.IsValid)
     {
         Session["product"] = product; 
         // lub    TempData["product"] = product;
      } 
    
     return Redirect to Action(...)    
}

Drugi Controler

[HttpGet]
public ActionResult Order (int id = 0)
{
     ......
}

[HttpPost]
public ActionResult Order (Order order)
{ 

     if (ModelState.IsValid
     {
         Product product = (Product)Session["product "];
         //lub  Product product = TempData["product"] as Product;

         db.Products.Add(product);
         db.Orders.Add(order); 
         db.SaveChanges();      


     }

     // i dalszy kod
     return Redirect to Action(...)    
}

Do przesyłania danych między kontrolerami i akcjami co lepiej użyć TempData czy Sesji?

Czytając ten link
http://sampathloku.blogspot.com/2012/09/how-to-use-aspnet-mvc-tempdata-properly.html

pisze bloger aby nie korzystać z TempData w metodzie HttpPost. Czy faktycznie jest to zła praktyka?

1

Napisz mniej więcej jak wygląda to od strony użytkownika.

Taki przykład:

  1. Wchodzi na stronę produktu
  2. Dodaje produkt do koszyka
  3. Przechodzi do kasy
  4. Potwierdza i składa zamówienie.
0

Dzięki @y_ użyłem sesji, gdyż TempData za szybko gubi dane. Mniej więcej o to chodziło.

3
szymon7500 napisał(a):

Do przesyłania danych między kontrolerami i akcjami co lepiej użyć TempData czy Sesji?

Lepiej żadnego z tych, ale wszystko zależy od celu. Wyświetlanie komunikatów błędów z serwera można zrobić przez ViewData/TempData, ale np. koszyk czy jakiegoś Wizarda można w całości zaimplementować po stronie przeglądarki, czy to przez ukryte inputy, czy przez webstorage. Z kolei, po stronie serwera można zamiast sesji użyć po prostu bazy.

Sesja ma dużo wad, jej nierozważne używanie to proszenie się o kłopoty.

1

Zgadzam się z @somekind. Użycie sesji powinno być poprzedzone napisaniem rozprawki na ten temat przynajmniej na stronę A4.

Idealnym rozwiązaniem byłoby używanie kontenera IoC (np. AutoFac) i w nim przechowywać obiekty per request i per session itp. Ale to trzeba na tym budować aplikację od początku.

0

Czemu nie sesje? Mam jeden formularz, wypełniam danymi, zapisuję w sesji i przechodzę do drugiego formularza, który wypełniam, zapisuję do drugiej sesji i przechodzę do strony podsumowania z łatwością pobieram dane z obu sesji, przy zapisie do bazy usuwam sesje. Dodatkowy atut jeszcze przed zapisem danych, gdy chcę skorygować jakieś dane to mogę powrócić do jakiegoś formularza i mam go już wypełniony danymi (nie mylić proszę z cache), które wcześniej wprowadziłem, mogę dokonać korekt, omijam podwójne zapisywanie danych do bazy, czy jak w przypadku TempData pilnować czy już odczytał lub zniszczył dane, itp.

Ale z drugiej strony jak są robione sklepy internetowe czy kupowanie biletów, gdzie wprowadzam dane w kilku formularzach i na samym końcu zatwierdzam wszystko?

1

Obiekt sesji jest potrzebny, ale trzeba mieć rozwagę w stosowaniu. A co w przypadku gdy użytkownik ma otwarte dwie karty w przeglądarce? Może się skończyć jak w PKP: https://niebezpiecznik.pl/post/kupujesz-bilet-pkp-intercity-uwazaj-na-ten-blad/

0

@Sarrus a czy jesteś pewien, że użycie kontenera IoC rozwiązałby problem, który przedstawiłeś w link-u? Kontener rozróżniłby, że z dwóch różnych kart próbujesz wpisywać dane czy raczej jedne dane nadpisałby drugimi?

0

Kontener nie rozwiązuje żadnego problemu. Kontener IoC pomaga w łatwiejszym zarządzaniu kodem. Dałem przykład jak może się skończyć nierozważne używanie zmiennych sesji

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