2008-12-22 16 views
94

Używam AcceptVerbs metodę opisaną w Scott Gu 5 Podgląd ogłoszenia blogu do radzenia sobie z formularza wpisy w ASP.NET MVC:ASP.NET MVC - TempData - dobra czy zła praktyka

  • Użytkownik dostaje pusty Formularz poprzez GET
  • posty użytkownika wypełnionego formularza metodą POST do tego samego działania
  • Akcja sprawdza dane, podejmuje odpowiednie działania, i przekierowuje do nowej widzenia

Więc nie trzeba używać TempData. To powiedziawszy, muszę teraz dodać krok "potwierdź" do tego procesu i wydaje się, że wymaga on użycia TempData.

Z jakiegoś powodu, mam awersję do używania TempData - że jest to coś, co należy zaprojektować.

Czy jest to w ogóle poważny problem, czy też go wymyślam?

+1

Rozważ wykonanie kroku "Potwierdź" w oknie dialogowym javascript. Mniejsza liczba wizyt na serwerze i nie napotkasz na ten problem. – ajma

Odpowiedz

24

W pewnym sensie uważam dane tymczasowe za mechanizmy przeciwpożarowe do powiadamiania użytkownika. Wspaniale jest im przypomnieć o czymś, co ostatnio zrobili, ale nie chciałbym też uczynić tego wymaganym krokiem w procesie użytkownika. Powodem jest to, że jeśli odświeżą stronę, myślę, że zniknie. Cóż, myślę, że jestem również niezdecydowany, aby go używać, ponieważ nie jest dobrze zdefiniowany, jak wiarygodny jest.

Zastanawiam się, czy problem polega na tym, że przekierowuje się akcję na inną stronę przed krokiem potwierdzenia. Zastanawiam się, czy zamiast tego po pierwszym przesłaniu, możesz zrobić wystarczająco dużo przetwarzania, aby wygenerować okno dialogowe potwierdzenia, a następnie zwrócić oryginalną stronę z pytaniem potwierdzającym. Podobnie jak w przypadku sprawdzania poprawności, z wyjątkiem reguły sprawdzania poprawności, która sprawdza, czy został wykonany krok potwierdzający (z ukrytym interfejsem potwierdzającym do momentu, gdy inne sprawdzanie poprawności przejdzie).

2

To tak, jak przy użyciu ViewData, co oznacza, że ​​prawdopodobnie nie stanowi zagrożenia dla bezpieczeństwa. Ale wolałbym używać ViewData niż TempData. Sprawdź tutaj, aby porównać: http://www.squaredroot.com/2007/12/20/mvc-viewdata-vs-tempdata/

W zależności od projektu, zawsze możesz przechowywać użytkownika/kosz lub cokolwiek potrzebujesz w tempdata w bazie danych i po prostu mieć pole "IsReady", które wskazuje, czy jest zakończone, czy nie, dzięki czemu można ją rozszerzyć na później, jeśli chcesz pamiętać, że ludzie mogą zamknąć swoje przeglądarki.

+0

Losowe obniżenie ceny? –

+2

Uwaga: artykuł, do którego prowadziło łącze, był aktualny w swoim czasie, ale jest dokładny tylko w przypadku MVC1. TempData zmieniła się dość znacząco w MVC2. – mikemanne

+0

@mikemanne, yeah. Ale odpowiedź brzmi pod koniec 2008 roku. Ale może odpowiedź powinna zostać zaktualizowana? –

2

Dlaczego masz taką niechęć? To jest po prostu wykonanie swojej pracy i zrobienie tego dobrze :)

Jeśli nie spodoba ci się z tego powodu, że nie jest mocno wpisane, zawsze możesz stworzyć opakowanie, które zapewni ci mocno napisany interfejs.

3

Mam metodę GetModel, która najpierw sprawdza dla TempData ["model"] i zwraca to. W przeciwnym razie GetModel ładuje odpowiednie dane z bazy danych.

To zapisuje dodatkowe obciążenie z bazy danych, gdy mam akcję, która musi zwrócić inny widok, który wymaga tych samych danych modelu.

+0

Yah, natknąłem się na to: (1) sprawdź czy istnieje rekord, jeśli jest prawidłowy, przekieruj do strony (2) załaduj rekord do wyświetlenia dla użytkownika. Baza danych zostaje trafiona do sprawdzania poprawności i wyświetlania. Używam do tego TempData, ale czułem się jak sprawdzanie opinii. Podoba mi się twoja metoda, żeby to powstrzymać. – anonymous

+0

Byłoby lepiej użyć odpowiedniego mechanizmu buforowania w tym scenariuszu. – nicodemus13

31

Myślę, że dobrze się wahasz przed użyciem TempData. TempData jest przechowywana w sesji, a to może mieć konsekwencje dla Ciebie, jeśli:

  1. Nie używać sesje na swojej stronie teraz
  2. masz system, który wymaga, aby przeskalować do wysokiej przepustowości, tzn” d wolą unikać stanu sesji całkowicie
  3. Ty nie chcesz korzystać z plików cookie (nie wiem jak dobrze MVC obsługuje sesje plików cookie teraz)

Jeśli witryna musi mieć wysoką dostępność, to istnieje są dodatkowe uwagi dotyczące stosowania stanu sesji, ale wszystkie są rozwiązane e problemy.

+16

TempData nie musi być przechowywany w sesji, chociaż jest domyślnym dostawcą - prawdopodobnie dlatego nie znajduje się w metodzie doc. Jest tam także dostawca plików cookie, jako przykład napisania niestandardowego dostawcy. – FinnNk

76

Nie trzeba mieć awersji do TempData ... Ale jeśli nie jest używana poprawnie, może to być z pewnością oznaką złego projektu. Jeśli używasz adresów URL RESTful, TempData to najlepsza praktyka przesyłania wiadomości z akcji POST do akcji GET. Rozważ to:

Masz formularz pod adresem URL Produkty/Nowy. Formularze Posty do Produktów/Utwórz, które potwierdzają formę i tworzą Produkt. Po sukcesie Sterownik przekierowuje do Produktów URL/1 i w przypadku błędu przekieruje z powrotem do produktów/Nowy, aby wyświetlić Komunikaty o błędach.

Produkty/1 to tylko standardowe działanie GET dla produktu, ale chcielibyśmy wyświetlić komunikat informujący, że wkładka okazała się sukcesem. TempData jest do tego idealna. Dodaj wiadomość do TempData w Post Controller i dodaj trochę logiki do widoku i gotowe.

Po awarii dodałem wartości wprowadzone w kolekcji FormCollection i zbiór komunikatów o błędach do TempData w akcji postu i przekierowanie do początkowego działania Prodcuts/New. Dodałem logikę do widoku, aby wypełnić dane wejściowe formularza poprzednio wprowadzonymi wartościami wraz z komunikatami o błędach. Wydaje mi się ładne i czyste!

+0

Po co ta dodatkowa praca, kiedy możesz pisać bezpośrednio z powrotem do "Produkty/Nowy"? Jaką wartość dodaje "Produkty/Utwórz"? – mpen

+2

@Mark, używając Products/Create zapobiega sytuacjom, w których użytkownik wykonuje akcję poprzez oddzwonienie, a następnie po późniejszym odświeżeniu (lub zakładce i zwrocie) przypadkowo ponownie wykona akcję. Aby uzyskać więcej informacji, zobacz http://en.wikipedia.org/wiki/Post/Redirect/Get – ehdv

+2

@ehdv: Ale czy to naprawdę? Po sukcesie przekierowuje na inną stronę, w przypadku niepowodzenia powinien wyświetlać błędy formularza i nie należy podejmować żadnych działań, więc nie zaszkodzi. Zapobiegłoby to tylko irytującemu "jesteś pewien, że chcesz ponownie opublikować", co często chcę. Myślę, że to zależy od twojego projektu, więc widzę twój punkt widzenia. – mpen

3

Zapoznaj się z sessionless controllers w MVC3. Okazało się, że użycie sesji zapobiega równoległemu wykonywaniu żądań pojedynczego użytkownika, a tym samym prowadzi do pogorszenia wydajności.

Ponieważ tempdata domyślnie korzysta z sesji, nie można korzystać z tej funkcji. Możesz przełączyć na używanie plików cookie dla tempdata, ale jest to trochę niezręczne (przynajmniej dla mnie). Wciąż jest jednak czystszy niż stan ekranu, więc może to nie jest tak wielka zaleta.

+2

Masz rację na temat kontrolerów Sessionless i TempData używa sesji. ALE POCZEKAJ! Sesja NIE jest czymś złym i można łączyć Sessionless z kontrolerami Sesji. Naprawdę chcesz kontrolerów Session_less_, gdy wykonujesz wiele wywołań AJAX na serwer (z poziomu przeglądarki). Kiedy twoje trafienie na jednej stronie -at-a-time- ... nie musisz być bezsesowy. W rzeczywistości nie powinno to dawać ci żadnych korzyści ... ponieważ trafiasz tylko na serwer RAZ. Więc można mieszać i dopasowywać. –

0

Wszystkie dobre odpowiedzi, czy spojrzeć na to za przekazywanie wiadomości wzdłuż.

TempData i sesja nie są najlepszym pomysłem dla architektur RESTful, ponieważ większość sesji jest przechowywana w pamięci. Tak więc, gdy chcesz użyć farmy serwerów, sesja użytkowników będzie istniała na jednym serwerze, podczas gdy ich następne żądanie może zostać wysłane na inny serwer.

To powiedziane, spójrz na to wykorzystanie TempData do przekazywania wiadomości tutaj.

http://jameschambers.com/2014/06/day-14-bootstrap-alerts-and-mvc-framework-tempdata/

mabye to może być dostosowane do korzystania z podejścia ciąg zapytania, jeżeli są stosowane tylko dla przekierować do kolejnych wpisów stron.

Powiązane problemy