2010-12-14 15 views
7

Utknąłem! Mam wrażenie, że plik _layout.cshtml jest używany do zawartości typu MasterPage. Wszystko tam jest renderowane na każdej stronie. Naturalnie chcę napisać kod do renderowania mojego menu paska bocznego w tym pliku.Czy kontroler może wpływać na plik _layout.cshtml?

Chcę dynamicznie wyświetlać listę kategorii z mojego DB, ale mam problem z przekazaniem rzeczywistego modelu kategorii do Layout.cshtml, ponieważ wydaje się, że żaden kontroler faktycznie go nie dotyka.

Wszelkie sugestie?

W przeciwnym razie, proszę, powiedz mi, jak podejść do tego problemu. Przez ostatnie trzy dni łamałem sobie głowę i wciąż nie ma eleganckiego rozwiązania.

muszę:

  1. Dynamicznie pobrać listę kategorii z DB.
  2. Wyświetl listę kategorii w każdym widoku. (W związku z tym użycie _layout.cshtml)
  3. Elegancko obsługiwać różne kategorie kliknij.

Jestem na moim końcu rozumu. : P W jaki sposób jesteś rozwiązać ten problem?

+3

Zadajesz kilka pytań związanych z tym w ciągu ostatnich kilku dni, i podano wiele rozwiązań, w tym jeden lub połączenie 1) RenderPartial 2) RenderAction 3) ViewData 4) Global action filter etc. Czy próbowałeś któregoś z nich i jak nie spełniają twoich wymagań? – marcind

+0

Sprowadza się to do pliku layout.cshtml, który nie może korzystać z przekazanego modelu, ponieważ nie działa na nim żaden kontroler. Propozycje? –

+1

@Serg, RenderAction? – jfar

Odpowiedz

1

Każdy model widoku, który przekazujesz do widoku, jest automatycznie dostępny na stronie wzorcowej. Jeśli nie używasz RenderAction/Action, która jest najlepszym podejściem, musisz utworzyć niezbędne dane strony wzorcowej w każdej akcji i dodać ją do viewdata - albo przez wspólną klasę bazową dla silnie typowanego widoku, który zawiera wszystkie dane strony wzorcowej lub za pomocą słownika viewdata.

Zdecydowanie zaleca, aby przejść do podejścia html.action. W ten sposób masz całkowicie oddzielne działanie kontrolera do obsługi listy kategorii. Ta operacja może pobrać dane kategorii zasobów i przywrócić kontrolkę użytkownika categorylist jako widok częściowy i nie będziesz musiał martwić się o zanieczyszczanie wszystkich innych działań tymi danymi.

+0

Czy możesz rozwinąć pojęcie "html.action"? Wszelkie strony internetowe/informacje na temat tego, co to dokładnie oznacza? – thecoop

+1

To dobre wprowadzenie: http://www.asp.net/mvc/videos/mvc-2/how-do-i/aspnet-mvc-2-render-action –

0

Osiągnąłem coś podobnego dzięki temu, że moje ViewModels zaimplementowały interfejs, który zawiera elementy, które zawierają dane menu. W mojej metodzie działania ustawiam te dane. Wtedy moim zdaniem mogę sprawdzić, czy mój pogląd, że model realizuje inteface pociągnąć dane menu na zewnątrz i renderowanie menu (w częściowym widokiem faktycznie)

1

Jak ja to widzę, ViewData (i jego krewnych, jak ViewBag, model, itp) jest przeznaczona do określony bieżący widok. Twój _Layout.cshtml nie jest specyficzny dla bieżącego widoku; i byłoby niezręcznie, gdyby KAŻDY kontroler musiał przekazać dane kategorii oprócz danych, które musi przekazać dla widoku.

Zamiast tego, co robię, dostarczam statyczną metodę w jednej z moich klas pomocniczych, która pobiera kategorie z DB. Również robię tam buforowanie, więc nie muszę uderzać w DB na każde żądanie. Układ.cshtml po prostu wywołuje tę metodę statyczną. Prosty i elegancki.

Jeśli chcesz, możesz doprowadzić do częściowego widoku, uczynić z niego metodę pomocniczą, cokolwiek.

Jedna uwaga jednak - mój niestandardowy widok błędu również używa tego samego _Layout.cshtml, a jeśli DB przestanie działać, otrzymasz wyjątek próbujący wyświetlić wyjątek. ASP.NET MVC jest na tyle sprytny, aby wykryć to i przerwać przetwarzanie, ale pozostaje ci niedopowiedziana domyślna strona błędu. To, co zrobiłem, to umieszczenie oświadczeń o niebezpiecznych połączeniach, które po cichu ignorują wyjątek, jeśli bieżąca strona jest widokiem błędu.

Powiązane problemy