Metoda "RenderPartial()" w ASP.NET MVC oferuje bardzo niski poziom funkcjonalności. Nie zapewnia ani nie próbuje dostarczyć prawdziwego modelu "kontrolera podrzędnego".ModelFactory w środowisku ASP.NET MVC w celu rozwiązania problemu "RenderPartial"
Mam coraz większą liczbę formantów renderowanych za pomocą "RenderPartial()". Dzielą się one na 3 główne kategorie:
1) mechanizmy kontroli, które są bezpośrednimi potomkowie konkretnej strony, że modela takiej strony
2) parametry, które są bezpośrednimi potomkowie konkretnej strony, że użytkowania ten model strony z additional key of some type. Pomyśl o implementacji "DataRepeater".
3) Elementy sterujące reprezentujące niepowiązaną funkcję na stronie, na której się pojawiają na. Może to być wszystko, od rotatora banerów , do formularza opinii, lokalizator sklepu, rejestracja listy adresowej. Kluczową sprawą jest to, że nie ma znaczenia, która strona zostanie umieszczona.
Ze względu na sposób model ViewData
pracuje tam istnieje tylko jeden model obiektu na żądanie - który jest cokolwiek powiedzieć na subcontrols potrzeba musi być obecny w modelu widoku.
Ostatecznie zespół MVC będzie miał nadzieję, że wyjdzie z prawdziwym modelem "kontrolera podrzędnego", ale do tej pory dodaję tylko coś do głównego modelu strony, który potrzebne są także formanty podrzędne.
W przypadku (3) powyżej oznacza to, że mój model "ProductModel" może zawierać pole dla modelu "MailingListSignup". Oczywiście nie jest to idealne, ale zaakceptowałem to przy najlepszym kompromisie z obecnymi ramami - i najprawdopodobniej "zamykać drzwi" do przyszłego modelu subkontrolera.
Kontroler powinien być odpowiedzialny za uzyskanie danych dla modelu, ponieważ model powinien być po prostu głupią strukturą danych, która nie wie, skąd pochodzą jej dane. Ale nie chcę, aby kontroler musiał tworzyć model w kilku różnych miejscach.
Co zacząłem robić to stworzenie fabryki, która stworzy mi model. Ta fabryka jest wywoływana przez kontroler (model nie wie o fabryce).
public static class JoinMailingListModelFactory {
public static JoinMailingListModel CreateJoinMailingListModel() {
return new JoinMailingListModel()
{
MailingLists = MailingListCache.GetPartnerMailingLists();
};
}
}
Moje pytanie brzmi: jak inne osoby z tym samym problemem faktycznie tworzą modele. Jakie będzie najlepsze podejście do przyszłej kompatybilności z nowymi funkcjami MVC?
- UWAGA: Są problemy z
RenderAction()
że nie będę wchodzić tutaj - zwłaszcza, że jej tylko w MvcContrib i nie będzie w wersji RTM ASP.NET-MVC. Inne problemy spowodowały, że zdecydowałem się go nie używać. Tak więc udawajmy, że istnieje tylkoRenderPartial()
- lub przynajmniej to, co postanowiłem użyć.
tym bardziej myślałem o tym mniej podobało mi się ten pomysł. to im więcej myślałem o tym, tym bardziej im się to podobało. głównie dlatego, że łatwiej jest każdemu dodać kontrolę do strony - wystarczy dodać atrybut i RenderPartial i gotowe. –
To brzmi jak dużo myślenia; -p –
skończyło się używaniem tego podejścia w kilku miejscach w mojej aplikacji. sprawia, że znacznie czystsze jest stosowanie pewnych rzeczy do modeli na całym świecie. Używam go zarówno do "modelu podstawowego", który odpowiada stronie wzorcowej, jak i "modeli obszarowych" dla różnych obszarów w witrynie. dość elastyczny i chociaż nie jestem całkowicie zakochany w wstrzykiwaniu rzeczy do moich modeli to działa całkiem dobrze –