2009-11-11 14 views
5

W naszej obecnej aplikacji Asp.net MVC mamy 2 systemy menu jeden po drugiej stronie i jeden po lewej stronie. Teraz mamy częściowy widok, który renderuje menu, jednak jest to jedyny sposób na to, aby to również przywrócić elementy menu z każdym pojedynczym ViewModel? Staramy się nie używać słownika ViewData.System dynamicznego menu Asp.net MVC

Myślę, że odpowiedź na to pytanie brzmi: tak, ale chcę zobaczyć, co inni myślą

Odpowiedz

3

3 opcje:

  1. RenderAction całą drogę.

  2. RenderPartial as Ryan odpowiedział.

  3. Na przykład abstrakcyjny MasterViewModel. Wszystkie twoje modele odziedziczyłyby po tym. Wypełniony przez filtr akcji.

3

Można użyć Render Akcja z biblioteki MVC Future's jeśli chcesz mieć swój własny kontroler, itp dla siebie menu z używania głównego modelu widoku.

+1

Wydaje mi się, że odnosisz się do zestawu RenderAction, a nie do RenderPartial z zespołu Futures. –

+0

Masz rację, dziękuję - zredagowałem wpis. :) –

1

Zasadniczo są dwie opcje:

  1. Użyj ViewModel skonfigurować pozycje menu do wyświetlania, będą dostępne z dowolnego widoku, pełnej lub częściowej.

  2. Utwórz hierarchię silnie typowanych modeli, umieść elementy menu gdzieś w BaseModelu, wtedy będą one obecne w każdym pochodzącym modelu.

To, co może Cię zainteresować, to kontrolery asynchroniczne lub częściowe żądania. To nie jest zaimplementowane w ASP.NET MVC, ale możesz sprawdzić projekt społecznościowy MVC Contrib, ma on pewne wsparcie w tym zakresie.

+0

Biblioteka MVC Contrib jest dobra, ale może okazać się łatwiejsze korzystanie z biblioteki MVC Future firmy Microsoft, jeśli wszystko, czego wymaga, to możliwość renderowania części. –

0

Istnieje wiele opcji do obsługi tego, ale istnieje jeden bardzo prosty sposób, w jaki radzimy sobie z tym, który nie wymaga ponownej architektury całej aplikacji.

Mamy podobne problemy, gdzie nasza strona/częściowa ma dobrze zdefiniowany typ ViewData.Model, ale widok zawiera części, które są ponownie używane na wielu stronach. Staraliśmy się również unikać używania narzędzia ViewDataDictionary.

Jednak okazało się, że dokładnie opisany przypadek to scenariusz DOKŁADNY, w którym chcielibyśmy użyć wpisu ViewDataDictionary. W naszym modelu aplikacji przechowujemy statyczną klasę Constants, która zawiera wewnętrzne klasy dla każdego typu stałej, w tym klucze ViewData, dzięki czemu nie mamy ciągów dla tych rzeczy pływających wszędzie.

Następnie, nasza akcja kontrolera zapełnia klucz ViewData, a część wewnątrz drugiej strony/sprawdza częściowo istnienie tego klucza i używa go zamiast ViewData.Model. To sprawia, że ​​częściowa praca jest wszędzie tam, gdzie jest potrzebna i utrzymuje swój ViewModel w czystości. Używając stałych, wszędzie unikamy ciągów znaków.

0

Użyj ActionFilter do wypełnienia ViewData potrzebnymi informacjami o menu. Zastosuj go tylko do klas i/lub metod (prawdopodobnie w klasie kontrolera bazowego, jeśli jest potrzebna wszędzie).Utwórz kilka metod rozszerzania na kontrolerze, które powodują, że dostęp do danych z ViewData jest mocno napisany (i przejrzysty w przypadku późniejszej zmiany miejsca przechowywania).

Niedawno zrobiłem a blog post z podobnym podejściem (potrzebowałem listy sponsorów do wyświetlenia na każdej stronie). Może pomóc wskazać ci właściwy kierunek.

3

Czy używasz kontrolera bazowego? Odkryłem, że używanie jednego z nich i przesłonięcie metody OnActionExecuting pomoże mi utrzymać centralne miejsce na utrzymanie całej mojej wspólnej logiki strony.

0

Po prostu dodać do tego, RenderAction został dodany do MVC2 Beta.