2010-06-24 22 views
5

Czy każdy może wyjaśnić, dlaczego zdefiniowałeś ViewData ["MenuData"] dla każdej akcji dla czegoś takiego jak dynamiczne menu?ASP.NET MVC, częściowe widoki i dane

Mam prosty częściowy widok, który renderuje menu, renderuję to menu z poziomu strony wzorcowej. Jest to intentive dla mnie pochodzących z ASP.NET WebForms, ale jedynym sposobem dla mnie, aby wypełnić menu jest przekazywanie ViewData ["MenuData"], ale następnie muszę to zrobić w każdej akcji kontrolera. To trochę głupie, że za każdym razem będę musiał zdefiniować dane tego widoku.

Pod względem testowalności i co to jest ASP.NET MVC, jak mam się do tego podejść?

Odpowiedz

4

Inną opcją jest użycie metody RenderAction zamiast które będą wywołaj akcję (albo na bieżącym kontrolerze, albo podaj też nazwę kontrolera, ten kontroler), który może następnie utworzyć dane menu dla ciebie i wywołaj częściowy widok ascx:

Tak na mojej stronie wzorcowej Mogę:

<% Html.RenderAction("MenuArchiveList"); %> 

Wtedy w moim kontrolera:

public ActionResult MenuArchiveList() { 
    return PartialView("BlogArchiveList", 
        _BlogRepository.GetArchiveYearPostCounts()); 
} 

To wtedy z powodzeniem odnajduje kontrolę użytkownika \Views\Shared\BlogArchiveList.ascx

Jeśli chcesz się upewnić, że akcja jest tylko kiedykolwiek nazywane w kontekście częściowym widokiem , powinieneś go udekorować ChildActionOnlyAttribute.

Zostało to dodane do System.Web.Mvc w wersji 2 z przestrzeni nazw "futures" Microsoft.Web.Mvc.

+0

To wszystko. Dziękuję Ci. –

+0

Nie ma problemu, to przyjemność. –

0

Należy użyć podstawowy kontroler, który obsługuje powtarzające się populację Twojego modelu widoku, a następnie mieć wszystkie sterowniki czerpać z niego

zobaczyć tutaj ViewModel Best Practices

Powiązane problemy