Otrzymuję dane z modelu (tablica z danymi) i muszę wyświetlić w określonym formacie. Muszę iterować po tablicy, sformatować dane, a następnie wyświetlić. Gdzie powinienem sformatować dane do wyświetlenia? W modelu, kontrolera lub widoku? Dziękuję.MVC: Gdzie powinienem sformatować dane?
Odpowiedz
Powtórzenie tablicy i wyświetlenie danych odbywa się w widoku. Dlatego też formatowałem w widoku. Jeśli formatowanie jest skomplikowane i/lub wymaga dużej ilości kodu, umieść go w funkcji pomocnika.
Na przykład:
Widok:
<?php foreach($array as $item): ?>
<p><?php echo format_function($item); ?></p>
<?php endforeach; ?>
Helper:
function format_function($text)
{
// Do some formatting here...
return $formatted_text;
}
Funkcja pomocnika brzmi dobrze :) – jared
NIE zanieczyszczaj swojego widoku takim gównem. Widok nie jest odpowiedzialny za formatowanie. Spróbuj użyć oddzielnej warstwy, która jest odpowiedzialna za formatowanie/transformację twojego modelu obiektowego do widoku przyjaznego modelu widoku :) Podobnie jak powiedział Stefanvds w .NET istnieje obiekt-obiekt odwzorowujący o nazwie AutoMapper może istnieje odpowiednik w php. – Rookian
Nie zgadzam się. Każda struktura MVC, którą znam, ma gotowe do użycia wsparcie. Jeśli nie w takich przypadkach, to do czego powinienem użyć pomocników? Twoje rozwiązanie może być bardziej "czyste", ale w tym prostym przypadku czuję, że dodanie kolejnej warstwy przesadza. – Mischa
jeśli ViewData ma danych pochodzących z różnych modeli, albo ma tylko wybraną część 1 modelu, można utworzyć ViewModel, który można następnie mapować za pomocą Automapper.
ViewModels ma kilka zalet. Są jasne pracować, porozrzucane swoje dane, można dodać bezpieczeństwa, ...
wszelkie linki ze szczegółami do tego wzoru? – Gordon
@Gordon: http://en.wikipedia.org/wiki/View_model? – fabrik
@fabrik Do innych zastosowań, zobacz [Zobacz model (ujednoznacznienie)] (http://en.wikipedia.org/wiki/View_model_%28disambiguation%29). Nigdy nie boli, aby mieć link podczas odwoływania się do wzoru. – Gordon
Można to zrobić w View.Not w modelu W widoku nie można konkretne działanie (konwersja/warunki /)
Jeśli pracujesz nad większym projektem, sugerowałbym, abyś miał dodatkową warstwę lub klasę, która jest odpowiedzialna za przekształcenie twojego obiektu (np. Obiektu modelu domeny) w obiekt transferu danych (zobacz obiekt modelu).
przeciwnym razie zastosować sugestie robi formatowanie w widoku :)
Przemieniający może być związany z ciągów formatowania, dziesiętne (waluta), datetimes i tak dalej. Możliwa jest również transformacja wykresu obiektu (spójrz na mój przykład) na płaskie DTO.
Sterownik będzie odpowiedzialny za wywołanie algorytmu odwzorowania.
W związku z tym nie trzeba wykonywać iteracji odniesień do obiektu. Zamiast tego używaj płaskiego, dobrze sformatowanego modelu widoku.
Twój widok nie będzie zaśmiecony i wygląda bardzo czysto.
Narzędzie, które wykonuje to zadanie transformacji, jest dostępne w świecie .NET. Nazywa się AutoMapper. Być może istnieje odpowiednik w PHP.
Oto przykład
Jest to model obiektowy:
Można przekształcić go w tym inteligentnego modelu Widok:
zalet tego podejście:
rozdzielenia dotyczy
czysty widok
żadne duplikacje kod, tzn formatowania datetime w każdym widoku. (Nie powtarzaj się!)
Wadą tego podejścia:
- drogie jak na początku, więc małe projekty nie czerpać z tego podejścia
Do w Twoim Widoku, ponieważ jest odpowiedzialny za prezentację.
Powodem
- nie robi to model jest, że można następnie renderowanie różne poglądy, stosując te same dane (w przeciwnym razie trzeba utworzyć inny zestaw danych),
- nie robi w kontrolerze jest tak dlatego, że nie jest obowiązkiem kontrolera
Zobacz MVC background reading
Prezentacja! = formatowanie danych. Rozważmy następujący przykład:
Międzynarodowy sklep ze stroną produktu zawierającą różne informacje dotyczące wymiarów produktu itp. Ze względu na międzynarodowy charakter sklepu, dane powinny być sformatowane inaczej dla każdego miejsca, w którym jest odwiedzany sklep. Na przykład: W Europie pomiary są wyświetlane jako wartości metryczne, podczas gdy klienci z USA widzą te same dane sformatowane jako wartości imperialne.
Należy zauważyć, że ten szczególny typ danych nie powinien być zapisywany wiele razy dla każdego formatu, chociaż dane dotyczące cen powinny na przykład być. Wynika to z faktu, że ceny produktów do różnią się w zależności od regionu. Z drugiej strony pomiary i daty są równe w różnych lokalizacjach; tylko sposób wyświetlania i formatowania różnią się. Informacje powinny być zawsze przechowywane z jak najmniejszą nadmiarowością.
Część widokowa takiego sklepu (lub jakiejkolwiek aplikacji opartej na MVC, o to chodzi) nie powinna robić nic innego poza renderowaniem danych i określaniem, w jaki sposób dane te są prezentowane użytkownikowi. Same dane nie powinny być w żaden sposób zmieniane przez widok.Właśnie dlatego informacje dotyczące pomiarów i czasu powinny być przechowywane w standardzie ISO w formacie standardowym, dzięki czemu formatowanie danych do innych formatów jest łatwiejsze. Pomiary powinny być przechowywane na przykład jako wartości metryczne. Rzeczywiste formatowanie danych dla ustawień narodowych powinno odbywać się w modelu po pobraniu zbioru danych z bazy danych, najlepiej z dostępną statycznie klasą klasy pomocniczej dla uzyskania największej elastyczności. Po sformatowaniu danych jest on zwracany do kontrolera, który następnie zwraca go do bieżącego widoku.
Inną ważną wadą tego sposobu obsługi formatowania danych jest to, że dane nadal będą poprawnie sformatowane, gdy spróbujesz pobrać zestaw danych za pomocą akcji bez widoku (np. Obiekt JSON pobrany przez AJAX). Dane, które są odsyłane do klienta w jakikolwiek sposób (za pomocą "normalnego" szablonu HTML lub jako ciąg JSON/XML) nie powinny się różnić; tylko sposób, w jaki jest przedstawiony .
Uzgodnione. SoC dotyczy odpowiedzialności i zazwyczaj w architekturze prezentacji z pasywnym widokiem (np. Wariacja MVP, MVVM, MVPVM itp.), Odpowiedzialność za formatowanie/przygotowanie danych nie spoczywa na widoku. Byłby to prezenter/viewmodel, aw przypadku bardziej "ASP" MVC w stylu MVP, na przykład, sterownik jeszcze lepiej, vm). Pasywność zwiększa testowanie/ponowne użycie, utrzymuje logikę biz z prezentacji. I ostatnia para zrobiła świetny punkt, o którym nie myślałem, co oznacza również, że "sformatowany" nie musi oznaczać sformatowania do oglądania. – user1172173
- 1. Gdzie powinienem ustawić język (CurrentThread.CurrentCulture)?
- 2. Mac OS X: Gdzie powinienem przechowywać typowe dane aplikacji?
- 3. Gdzie powinienem umieścić moje asp.net-mvc z mocno wpisanymi widokami?
- 4. Gdzie powinienem znaleźć współdzielone funkcje @helper w MVC Razor
- 5. Gdzie powinienem napisać JavaScript dla View Components?
- 6. Gdzie powinienem przechowywać klucz obcy?
- 7. Potrzebuję API. Gdzie powinienem zacząć?
- 8. Gdzie powinienem umieścić wtyczkę .vim?
- 9. Gdzie przechowywać dane w iphone?
- 10. Jak sformatować datę w siatce internetowej mvc
- 11. Gdzie Redis przechowuje dane
- 12. Gdzie powinienem przechowywać stan mojej gry?
- 13. Gdzie powinienem umieścić ogólnodostępną statyczną pustkę Główna?
- 14. Gdzie powinienem dodać autoryzację w asp.net WebAPI?
- 15. Gdzie powinienem zachować stan wyboru dla listy?
- 16. Gdzie powinienem przechowywać klucz api w szynach3?
- 17. gdzie powinienem robić obliczenia, PHP lub Mysql?
- 18. Gdzie powinienem zadeklarować zmienną sesji w asp.net
- 19. Gdzie powinienem umieścić Fabryki i Usługi AngularJS?
- 20. Gdzie powinienem wskazać katalog główny VCS TeamCity?
- 21. Gdzie ELMAH zapisuje swoje dane?
- 22. Gdzie przechowywane są dane const?
- 23. Dlaczego powinienem używać WCF z MVC?
- 24. Wdrażanie systemu czatu: gdzie przechowywać dane czatu?
- 25. Gdzie przechowywać dodatkowe dane użytkownika przy użyciu ASP.NET MVC i SqlMembershipProvider?
- 26. Wiosna MVC z Thymeleaf. Zaktualizuj dane statyczne
- 27. Jak szybko sformatować dane wejściowe ze strumienia w C++?
- 28. Jak sformatować moje dane dla pakietu R mlogit?
- 29. Jak sformatować zagnieżdżone dane modelu zestawu w tablicy?
- 30. Gdzie umieścić kod inicjujący w aplikacji ASP.Net MVC?
Jak chcesz. Ale lepiej w kontrolerze. – pltvs
@Alexander nie odpowiedzialność kontrolera. – Gordon
@ Robię to w kontrolerze ... – jared