2011-01-11 29 views
7

Po pracy z .net w obu WinForm i ASP.net przez kilka lat zaczynam teraz dostać się do MVC (trochę późno wiem). Jednym z głównych problemów jest dla mnie pojęcie "komponentów" wielokrotnego użytku, podobne do pojęcia kontroli użytkownika w formularzach internetowych.ASP> net MVC wielokrotnego użytku partials

Na przykład chciałbym mieć wiele "widżetów" w obszarze członków mojej witryny, z których jedna jest szczegółowa dla zalogowanego menedżera konta użytkownika. Mogę jednak utworzyć to jako częściowe, gdy strona ładuje dane, które należy przekazać jako część ViewModel/View Data. Chciałbym użyć tego widgetu w wielu różnych sekcjach, co oznaczałoby, że muszę umieścić kod w celu przekazania danych do wielu różnych kontrolerów. To wydaje się naruszać zasadę DRY, czy też czegoś tu brakuje? Idealnie chciałbym, aby wszystko było zawarte w 1 części, które można następnie wykorzystać na dowolnej stronie.

Odpowiedz

4

Można pójść na trzy sposoby:

1) W przypadku prostych kontroli bez większego logiki, można utworzyć nową instancję niestandardowego widoku modelu kontroli: Html.RenderPartial („YourControl”, nowy YourControlViewModel() {Param1 = "value1", Param2 = Model.AnotherValue});

2) Jeśli potrzebujesz jakiejś logiki zaplecza dla kontroli, możesz użyć Html.RenderAction ("ActionName", "SomeControllerName", RouteValuesDictionary); Spowoduje to wywołanie standardowej akcji kontrolera, skorzystanie z widoku i wstawienie wynikowego wyniku do strony. Możesz dodać atrybut [ChildActionOnly] do metody kontrolera, aby upewnić się, że metoda będzie dostępna tylko z Html.RenderPartial. Lekko narusza zasadę MVC (widok nie powinien wywoływać kontrolera), ale jest świetny dla widżetów i jest używany w świecie Ruby on Rails bez większych problemów. Można sprawdzić świetny artykuł z Haacked

3) Tworzenie własnych HTML pomocnika do zadań, takich jak formatowanie dat zwyczaj, obliczanie itp ..

W twoim przypadku, wybrałbym numer dwa.

+0

To ma wiele sensu - w moim prostym przypadku mógłbym użyć albo nie. 1 i pobrać aktualnie zalogowanego użytkownika z konstruktora ViewModel lub nr 2, jeśli wymagana jest interakcja dwukierunkowa. – Macros

+0

Jeśli model widoku ma identyfikator użytkownika, możesz podać go w wartościach trasy, użyć 2) i buforować dane. Inną opcją jest załadowanie bieżącego zalogowanego użytkownika z sesji, może to być bardzo proste, ale narusza kilka zasad. Zaznacz odpowiedź, jeśli ci się podoba, dzięki. – jhexp

Powiązane problemy