Używam AcceptVerbs
metody opisanej w poście w blogu Scott Gu's Preview 5 do obsługi wpisów formularzy w ASP.NET MVC:
- Użytkownik otrzymuje pusty formularz za pośrednictwem GET
- Użytkownik wysyła wypełniony formularz za pośrednictwem POST do tej samej akcji
- Akcja sprawdza poprawność danych, podejmuje odpowiednią akcję i przekierowuje do nowego widoku
Więc nie muszę używać TempData
. To powiedziawszy, muszę teraz dodać krok „potwierdzania” 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ś do zaprojektowania.
Czy to w ogóle uzasadniona obawa, czy też ją wymyślam?
asp.net-mvc
tempdata
anonimowy
źródło
źródło
Odpowiedzi:
Myślę o danych tymczasowych jako o mechanizmie „odpal i zapomnij” służącym do powiadamiania użytkownika. Wspaniale jest dać im przypomnienie czegoś, co ostatnio zrobili, ale wahałbym się, czy uczynić to wymaganym krokiem w jakimś procesie użytkownika. Powodem jest to, że jeśli odświeżą stronę, wierzę, że zniknie. Cóż, myślę, że waham się przed użyciem go, ponieważ nie jest do końca zdefiniowany, jak niezawodny jest.
Zastanawiam się, czy problem polega na tym, że akcja przekierowuje na inną stronę przed krokiem potwierdzenia. Zastanawiam się, czy zamiast tego po pierwszym przesłaniu możesz wykonać wystarczającą obróbkę, aby wygenerować okno dialogowe z potwierdzeniem, a następnie zwrócić oryginalną stronę z pytaniem potwierdzającym. Podobnie jak w przypadku walidacji, z tą różnicą, że reguła sprawdzania poprawności sprawdza, czy krok potwierdzenia został wykonany (z ukrytym interfejsem użytkownika potwierdzenia, dopóki inna walidacja nie przejdzie).
źródło
Nie trzeba mieć niechęci do TempData ... Ale jeśli nie jest używany prawidłowo, może to z pewnością wskazywać na kiepski projekt. Jeśli korzystasz z adresów URL zgodnych z REST, TempData to najlepsza metoda przesyłania wiadomości z akcji POST do akcji GET. Rozważ to:
Masz formularz pod adresem URL Produkty / Nowe. Formularz wysyła do produktów / stwórz, który weryfikuje formularz i tworzy produkt, po pomyślnym zakończeniu kontroler przekierowuje do produktów URL / 1, a w przypadku błędu przekierowuje z powrotem do produktów / Nowy, aby wyświetlić komunikaty o błędach.
Produkty / 1 to tylko standardowa akcja GET dla produktu, ale chcielibyśmy, aby pojawił się komunikat informujący, że wstawienie zakończyło się sukcesem. TempData jest do tego idealna. Dodaj wiadomość do TempData w Post Controller i dodaj trochę logiki do widoku i gotowe.
W przypadku niepowodzenia dodałem wartości wprowadzone w formCollection i zbiór komunikatów o błędach do TempData w Akcji Post i przekierowuję do początkowego Action Prodcuts / New. Dodałem logikę do widoku, aby wypełnić dane wejściowe formularza poprzednio wprowadzonymi wartościami wraz z wszelkimi komunikatami o błędach. Wydaje mi się ładne i czyste!
źródło
Products/New
? Jaką wartośćProducts/Create
dodaje?Myślę, że warto wahać się przed użyciem TempData. Dane TempData są przechowywane w sesji i może to mieć dla Ciebie konsekwencje, jeśli:
Jeśli Twoja witryna musi mieć wysoką dostępność, istnieją dodatkowe kwestie związane z zastosowaniem stanu sesji, ale wszystkie te problemy można rozwiązać.
źródło
Mam metodę GetModel, która najpierw sprawdza TempData [„model”] i zwraca to. W przeciwnym razie GetModel ładuje odpowiednie dane z bazy danych.
Oszczędza dodatkowe obciążenie z bazy danych, gdy mam akcję, która musi zwrócić inny widok, który wymaga tych samych danych modelu.
źródło
Sprawdź kontrolery bezsesyjne w MVC3. Okazało się, że korzystanie z sesji uniemożliwia równoległe wykonywanie żądań pojedynczego użytkownika, a tym samym prowadzi do obniżenia wydajności.
Ponieważ tempdata domyślnie używa sesji, nie będziesz mógł korzystać z tej funkcji. Możesz przełączyć się na używanie plików cookie dla danych tymczasowych, ale jest to trochę niezręczne (przynajmniej dla mnie). Wciąż czystszy niż stan widoku, więc może nie jest to taki wielki przełom.
źródło
Dlaczego masz taką awersję? Po prostu wykonaj swoją pracę i zrób to dobrze :)
Jeśli nie podoba ci się to z powodu braku silnego typowania, zawsze możesz stworzyć opakowanie, które zapewni ci interfejs z silnym typowaniem.
źródło
To jak używanie ViewData, co oznacza, że prawdopodobnie nie jest to zagrożenie bezpieczeństwa. Ale wolałbym używać ViewData niż TempData. Sprawdź tutaj, aby uzyskać porównanie: http://www.squaredroot.com/2007/12/20/mvc-viewdata-vs-tempdata/
W zależności od projektu, zawsze możesz przechowywać użytkownika / koszyk lub cokolwiek potrzebujesz w tymczasowych danych w bazie danych i po prostu mieć pole „IsReady”, które wskazuje, czy jest ukończone, czy nie, dzięki czemu można je rozszerzyć na później, jeśli chcesz wziąć pamiętaj, że ludzie mogą zamknąć swoje przeglądarki.
źródło
Wszystkie dobre odpowiedzi, czy spojrzałeś na to, aby przekazać wiadomości.
TempData i Session nie są najlepszym pomysłem dla architektur RESTful, ponieważ większość sesji jest przechowywana w pamięci. Więc jeśli chcesz użyć farmy serwerów, sesja użytkowników istniałaby na jednym serwerze, podczas gdy ich następne żądanie mogłoby zostać wysłane na inny serwer.
Biorąc to pod uwagę, spójrz na to użycie TempData do przekazywania wiadomości tutaj.
http://jameschambers.com/2014/06/day-14-bootstrap-alerts-and-mvc-framework-tempdata/
Mogłoby to być dostosowane do użycia podejścia opartego na ciągach zapytań, jeśli jest używane tylko do przekierowania do alertów innej strony.
źródło