Docela často se vyskytující fámou je, že v ASP.NET MVC nelze používat
serverové ovládací prvky (Server Controls). Pravda to je jen z části,
nelze používat jen ty prvky, které pro svoji funkčnost vyžadují
ViewState. Pojďme se podívat na ty, které fungují i v ASP.NET
MVC a můžou nám poskytnout nějakou zajímavou funkcionalitu a zpřehlednit
tak naše View.
MasterPage a Placeholdery
Snad první komponenty, které použijete, jsou
asp:ContentPlaceHolder a asp:Content. Narazíte na ně
při definování globální šablony (Master Page) a jednotlivých pohledů
(View). Většinou je použijete automaticky a ani si neuvědomíte, že jde
o serverové komponenty. A to je dobře. Rozhodně je lepší používat
master page než server side include nebo do všech stránek vkládat view user
controly se sdílenými částmi šablony.
LoginView a spol.
Další rozhodně doporučitelnou komponentou je asp:LoginView.
Ta slouší k rozdílnému zobrazování obsahu pro
nepřihlášené/přihlášené uživatele a také pro jednotlivé
uživatelské role. Předpokladem je, že využíváte ASP.NET Membership nebo
nějakou vlastní implementaci, která nastavuje do kontextu správné
IPrincipal. Pak můžete v kódu použít třeba toto:
<asp:LoginView ID="LoginView1" runat="server">
<AnonymousTemplate>
Nepřihlášený | <%= Html.ActionLink("Přihlásit se", "Login", "Account") %>
</AnonymousTemplate>
<LoggedInTemplate>
<asp:LoginName runat="server" />| <%= Html.ActionLink("Odhlásit se", "Logout", "Account") %>
</LoggedInTemplate>
</asp:LoginView>
Tím docílíte zobrazení odkazu pro přihlášení nepřihlášenému
uživateli a odkazu pro odhlášení uživateli přihlášenému. Jak vidíte,
je možné používat i asp:LoginName pro výpis jména aktuálně
přihlášeného uživatele.
Localize pro lokalizaci
Pokud děláte na webové aplikaci, která má být lokalizovaná do více
jazyků, jistě se vám bude hodit asp:Localize, které slouží
k snadnému definování míst, která mají být nahrazována texty
z resource souboru. Nebudu teď řešit jak rozhodnout jaký jazyk zvolit,
můžete ho mít natvrdo nastavený ve web.config souboru pro
jednotlivé deployované domény, nebo získat nějaký parametr z routy, nebo
nechat zjišťovat jazyk podle uživatelova nastavení prohlížeče. Pokud
budete mít zájem o problematiku lokalizace, můžu jí věnovat některý
další spot. :)
<asp:Localize runat="server" meta:resourcekey="SomeResource1" />
Lokalizaci pak provedeme v patřičném resx souboru následovně:
<data name="SomeResource1.Text" xml:space="preserve">
<value>Some text</value>
</data>
SiteMapPath pro drobečkovou navigaci
Další serverovou komponentou, kterou můžete ve svých šablonách
pohledů využít je asp:SiteMapPath, které slouží ke
generování drobečkové navigace podle struktury definované v souboru
Web.sitemap.
<asp:SiteMapPath runat="server">
<PathSeparatorTemplate> > </PathSeparatorTemplate>
</asp:SiteMapPath>
Xml pro transformaci
Jedním z posledních ze standardně dodávaných serverových komponent,
které ještě v MVC fungují je asp:Xml, které slouží ke
vkládání XML dat a jejich transformaci pomocí XSLT.
<asp:Xml runat="server" DocumentSource="/content/contact.xml" TransformSource="/content/contact.xslt"/>
ViewType pro silný typ modelu v pohledu
RC verze MVC frameworku přinesla vlastní serverovou komponentu, která
určuje silný typ pro vlastnost Model vašeho pohledu. Je to
alternativa k dědění z generické ViewPage.
<mvc:ViewType runat="server" TypeName="ViewPage<MyProject.Model.Customer>" />
A dál?
Dál můžete používat komponenty třetích stran, nebo vlastní, které
nevyžadují ViewState. Pokud máte jako předka vašich stránek
System.Web.Mvc.ViewPage nemáte v šablonách dostupný data
binging. I na to je třeba dávat pozor. Do budoucna by mělo dojít k tomu,
že helpery, které jsou součástí MVC frameworku, se dočkají
i zapouzdření do komponent. Ale k tomu dojde až po vydání verze
1.0. Již dnes však můžete najít jejich předběžnou implementaci v tzv.
ASP.NET
MVC Futures, které si můžete stáhnout na CodePlexu. Najdete mezi nimi
tyto komponenty:
- ActionLink,
- DropDownList,
- TextBox,
- Password,
- Label,
- Hidden a
- Repeater
Jejich předkem je MvcControl, který zpřístupňuje
ViewContext a ViewData. Repeater si třeba zajišťuje
DataBinding sám, takže není třeba ho explicitně volat ze stránky.
Nevýhoudou však je, že je třeba Evalovat data, protože Repeater není
silně typový. Mám takový pocit, že můj generický repeater
by měl v MVC fungovat bez problémů. Ještě jsem to nezkoušel, ale nevidím
důvod, proč by neměl. Asi provedu revizi a připravím vylepšenou variantu
pro MVC.
A to je pro dnešek vše.











Komentáře
dkl
21.39 - 28. března 2009 | #
Aleš Roubíček
08.00 - 29. března 2009 | #
dkl
19.20 - 29. března 2009 | #
Aleš Roubíček
19.34 - 29. března 2009 | #
Místo pro tvůj názor