2009-03-31 12 views
6

Próbuję przekazać ViewData do mojej masterpage mvc asp.net dla kontroli użytkownika mvc, który trzymam na stronie głównej. Na przykład utworzyłem rozwijaną listę nazw jako kontrolkę użytkownika mvc i umieściłem to na mojej stronie głównej.przekazywanie viewdata do asp.net mvc masterpages

Problem, który napotykam, polega na przekazywaniu danych ViewData do strony wzorcowej. Znalazłem ten artykuł od Microsoftu, który ma przyzwoite rozwiązanie, ale zastanawiałem się, czy istnieją inne "lepsze" rozwiązania. Rzeczą, której nie podoba mi się rozwiązanie w łączu, jest to, że muszę zmienić każdy kontroler, aby dziedziczył z nowej klasy kontrolera.

http://www.asp.net/learn/MVC/tutorial-13-cs.aspx

Edit: Problem Patrzę na to fakt, że jeśli umieścić formant użytkownika w moim masterpage, który opiera się na ViewData, muszę wielokrotnie to, że ViewData dla każdej strony który używa wspomnianej strony wzorcowej. Możliwe, że rozwiązanie w powyższym linku jest najlepszym rozwiązaniem, ale miałem nadzieję, że istnieją inne alternatywy.

Odpowiedz

1

na co warto, używam metody z tego poradnika w bieżącym projekcie i działa bardzo dobrze

Co możesz zrobić, jeśli dane są nieco statyczne (np. Menu, które nie zmienia się zbytnio), to umieszczenie obiektu w pamięci podręcznej, aby baza danych nie była wywoływana dla każdej inicjalizacji kontrolera.

4

Strona wzorcowa ma już dostęp do danych widoku. Jeśli chcesz silnie wpisany do niego dostęp, trzeba zrobić dwie rzeczy:

  1. Put rzeczy strony wzorcowej w klasie bazowej (np CommonViewData)
  2. Czy opanowania strony dziedziczą z generycznego ViewMasterPage <> klasa.

    "%>
+1

Problem, na który patrzę, polega na tym, że jeśli umieściłem kontrolkę użytkownika na mojej stronie wzorcowej, która opiera się na danych ViewData, muszę uwzględnić te dane ViewData dla każdej strony, która używa wspomnianej strony wzorcowej. – codette

0

Nie dość dostać swój problem ...

Problem Patrzę na to fakt, że jeśli umieścić formant użytkownika w moim masterpage, który opiera się na ViewData, muszę wielokrotnie m.in. to ViewData dla każdej strony używającej wspomnianej strony wzorcowej.

Cóż, tak ... oczywiście, że tak. Jeśli masz kontrolę użytkownika na swojej stronie wzorcowej, to oczywiście będziesz musiał przekazać wymagane dane dla tej kontroli użytkownika dla każdego widoku akcji, który używa tej strony wzorcowej.

To nie tak, że musisz powtarzać się, jeśli dziedziczysz po prostu z kontrolera podstawowego.

Czy Twój problem polega na tym, że niektóre kontrolery mają akcje, które robią i nie wywołują widoków wywodzących się z tej konkretnej strony wzorcowej? Więc jeśli implementujesz kontroler bazowy, akcje, które nie używają tej konkretnej strony głównej, nadal będą miały dla niej dane z widoku ...? (Jeśli to wszystko ma sens ;-)

+0

Cały powód, dla którego zadaję to pytanie, polega na sprawdzeniu, czy istnieją alternatywy dla rozwiązania podanego w linku w oryginalnym pytaniu. Ale przypuszczam, że stwardnienie rozsiane będzie publikować "najlepsze" rozwiązanie, które mogą wymyślić. – codette

2

Czy mógłbyś ewentualnie użyć metody OnActionExecuting w klasie kontrolera podstawowego i wypełnić tam dane widoku?

Coś jak:

protected override void OnActionExecuting(ActionExecutingContext context) 
{ 
    context.Controller.ViewData.Model = GetDataForControl(); 
} 

nie próbowałem go więc to tylko myśl ...

1

Zwykle używam abstrakcyjną klasę kontrolera dla mojego MasterPage, to jest to najlepsze rozwiązanie, ponieważ MasterPage jest jak "abstrakcyjny widok". Ale przesłonię metodę MasgerPageController View(), aby uwzględnić dane widoku.

protected override ViewResult View(string viewName, string masterName, object model) 
{ 
    this.ViewData["menu"] = this.PagesRepository.GetPublishPages(); 
    return base.View(viewName, masterName, model); 
} 
+0

Czyste i proste, dzięki! Cztery lata później w końcu dostał awans;) – statue

0

Myślę, że sugerowane rozwiązanie działa, ale nie jest idealnym rozwiązaniem. Jeśli umieścimy kod w konstruktorze BaseController, zostanie on wywołany nawet dla metod Action, które nie mają MasterPages (np. Metody Post i Ajax).
Myślę, że lepszym rozwiązaniem (nie idealnym) jest wywołanie metody Html.Action na stronie wzorcowej.

Powiązane problemy