23 maja 2008, 02:12
dario
Komentarze (0)
tip
asp.net-mvc
Od jakiegoś czasu dłubię sobie w domku aplikacyjkę ćwicząc MVC.NET. Co to jest i jak to się je napiszę innym razem. Teraz chciałem zwrócić uwagę na jeden aspekt. MVC.NET jest obecnie w fazie rozwojowej. O wersji beta można narazie sobie pomarzyć, a z tym co narazie jest trzeba sobie radzić. Charakter MVC.NET nie dopuszcza do działania kontrolek, które wymagają istnienia formy uruchamianej po stronie serwera, czyli <form runat="server">. Jak sobie radzić w takim razie z powtarzającym się kodem html? Otóż było by super, gdyby były tak zwane SubViews, czyli widoki, które mogły by być renderowane wewnątrz innego widoku. Niby można się bawić w zagnieżdżone MasterPage's, ale nie jest z tym tak różowo. Z pomocą przychodzi delegat do metody RenderView.
public delegate void RenderViewDelegate(string viewName, object viewData);
Metoda ta jest uruchamiana z kontrolera i jest odpowiedzialna za wyświetlenie 'viewsa', czyli widoku. Dzięki delegatowi przekazanemu do jednego z widoków jesteśmy w stanie w łatwy sposób renderować wskazane przez nas inne widoki jako części składowe (niczym kontrolki). :) Na początek zdefiniujmy sobie interface, który będzie podstawą naszego obiektu do transferu danych z kontrolera do widoku.
public interface IViewDataBase
{
RenderViewDelegate RenderViewSub { get; set; }
}
Teraz stwórzmy ten właściwy obiekt danych.
public class PortalViewDataBase : IViewDataBase
{
public RenderViewDelegate RenderViewSub { get; set; }
}
Każdy kolejny obiekt danych powinien dziedziczyć po obiekcie bazowym, który posiada powyższą implementację z delegatem. Teraz możemy na każdym widoku wykonać następujący kod:
<div id="contentArea">
<% ViewData.RenderViewSub("IndexSub", ViewData); %>
</div>
W miejscu wywołania zostanie wyrenderowany HTML z widoku IndexSub, który dodatkowo dostaje ten sam obiekt danych co widok nadrzędny. Co za tym idzie można uruchamiać wiele widoków zagnieżdżonych. UWAGA! Trzeba uważać na zapętlenie. :) Co do samego MVC.NET to postaram się jeszcze co nieco o tym napisać inną razą. :)