2008-12-03 17 views
10

Pracuję nad aplikacją ASP.NET MVC, która zawiera nagłówek i menu na każdej stronie. Menu i nagłówek są dynamiczne. Innymi słowy, pozycje menu i informacje o nagłówku są określane w czasie wykonywania.Używanie kontrolera podstawowego do uzyskiwania Common ViewData

Moja początkowa myśl polega na zbudowaniu kontrolera bazowego, z którego pochodzą wszystkie inne kontrolery. W kontrolerze bazowym uzyskaję dane menu i nagłówka oraz wstawię wymagane informacje do danych ViewData. Na koniec użyję ViewUserControl, aby wyświetlić nagłówek i menu za pośrednictwem szablonu strony wzorcowej.

Tak więc, staram się określić najlepszą praktykę dla budowania takiej funkcjonalności. Ponadto, jeśli jest to zalecane podejście, którą metodę należy przesłonić (domyślam się Execute) podczas uzyskiwania danych do wstawienia do ViewData.

Jestem pewien, że jest to typowy scenariusz, więc każda rada/najlepsze praktyki zostaną docenione! Z góry dziękuję!

EDYCJA: Znalazłem następujące zasoby po opublikowaniu tego (oczywiście), ale wszelkie dodatkowe anegdoty byłyby niesamowite!

http://www.singingeels.com/Blogs/Nullable/2008/08/14/How_to_Handle_Side_Content_in_ASPNET_MVC.aspx

How do you use usercontrols in asp.net mvc that display an "island" of data?

Odpowiedz

2

Zależy, skąd pochodzą informacje. Mamy standardowe dane widoku, które wykorzystujemy do generowania niektórych informacji na ekranie, które tworzymy w ten właśnie sposób. Działa dobrze i jest łatwy w utrzymaniu. We override the View method to implement strongly typed view names i użyj tych informacji, aby pobrać niektóre dane wymagane przez stronę wzorcową.

+0

To jest całkiem niesamowita technika. +1 Bazillion – jfar

0

ja odpowiem na twoje pytanie innym pytaniem. Czy kontroler bazowy musi określić, jaki to naprawdę jest, aby wygenerować odpowiednie dane menu? Jeśli tak, to pokonujesz cel polimorfizmu, a kod generujący dane powinien przejść w każdym kontrolerze, być może w trybie OnActionExecuting, jeśli menu jest takie samo dla wszystkich akcji. Przeniesienie jej z powrotem na klasę rodzicielską prawdopodobnie zakończy się pewną instrukcją przełączania w klasie nadrzędnej, która będzie musiała zająć się każdym kontrolerem pochodnym.

+0

Dane menu są takie same na wszystkich stronach, ale różne dla każdego unikalnego użytkownika. –

1

Możesz napisać rozszerzenie pomocnika, aby wygenerować nagłówek/menu. W ten sposób możesz pokazać to w różnych miejscach widoku, ale musisz zachować tylko jedno miejsce do konserwacji.

public static HtmlString MainMenu(this HtmlHelper helper) 
1

Użyj klasy kontrolera podstawowego do implementacji metod filtrowania generell. Klasa kontrolera implementuje niektóre interfejsy filtrów IActionFilter, IAuthorizationFilter, IExceptionFilter i IResultFilter, które są użyteczne do implementacji niektórych typowych zachowań dla wszystkich kontrolerów.

Jeśli dane menu są takie same na wszystkich stronach, ale różne dla każdego unikalnego użytkownika.
Wygeneruj menudę w metodzie OnAuthorization lub Initialize swojej klasy bazowej kontrolera. Pierwszy zostanie wywołany przy autoryzacji. Initialize zostanie wywołana przed każdą metodą działania. Masz dostęp do kontekstu ViewData. Wygeneruj tam menudatę. Umieść zawartość widoku menu i nagłówka na stronie wzorcowej i uzyskaj dostęp do wygenerowanych danych ViewData.

1

Kilka miesięcy temu zmierzyłem się z podobnym wyzwaniem projektowym - wprowadzając funkcję nawigacyjną, która zmienia się, gdy użytkownik nawiguje ze strony na stronę.

Zastanawiam się nad metodą OnActionExecuting, aby zebrać bułkę tartą i zapisać je w ViewData (używam nazwy akcji jako Chlebowy widok). Następnie zaktualizowałem stronę wzorcową, aby uwzględnić kontrolę użytkownika, która pobiera ViewData i renderuje bułkę tartą.

Należy pamiętać, że jeśli używasz domyślnego atrybutu obsługi błędów ASP.NET MVC [HandleError], a strona błędu używa tej samej strony głównej, która próbuje odczytać ViewData, wkrótce przekonasz się, że możesz nie uzyska dostępu do strony ViewData ze strony błędu i spowoduje zgłoszenie wyjątku. W zależności od tego, czy w przypadku scenariuszy awarii potrzebujesz ViewData, dobrym rozwiązaniem jest użycie oddzielnej strony wzorcowej, lub wykonanie tej czynności: How do I pass ViewData to a HandleError View?

Powiązane problemy