ASP.NET Dynamic Data 2/n – izmene postojećih resursa
Prošli post u seriji o Dynamic Data tehnologiji je govorio o tome kako možete da napravite kompletno funkcionalan CRUD UI sa svega par linija koda. Međutim, na taj način ostavljate otvoren ceo kod
U ovom postu ću se pozabaviti drugom stvari, a to je kako se template-i koji dolaze uz Dynamic Data mogu izmeniti da bi odgovarali specifičnim potrebama. Postoji nekoliko osnovnih načina kako se to može uraditi. Prvi, i najlakši, je izmena izgleda generisanog HTML koda keroz izmene u glavnom CSS fajlu koji se dobija kada se napravi sajt. Pošto su u pitanju standardna CSS pravila, nema potrebe da se zadržavamo na ovom koraku. Drugi načina je izmenom Pagetemplates koji sadrže u sebi kontrole za prikaz podataka. Treći način je izmenom korisničkih kontrola ili pravljenjem novih. Naravno, svaki od ovih načina je kumulativan, odnosno, veoma je jednostavno napraviti novi Page template za listanje svih slogova iz baze podataka i zatim modifikovati ponuđenu korisničku kontrolu koja prikazuje datum, da, recimo, odvaja na specifičan način mesece i dane.
No, krenimo od najlakšeg, a to je izmena strana.
Izmena strana
Dynamic Data dolazi sa nekoliko specijalnih foldera, od kojih je jedan i “Custom Pages” folder. U njemu je potrebno napraviti pod-folder sa imenom tabele za koju želimo da izmenimo template. Pošto radimo sa Chinook bazom podataka, želim da izmenim template za listanje za Artist tabelu, recimo. Proces je veoma prost. Prvo ću napraviti pod-folder sa imenom Artists u CustomPages folder (u slučaju da koristite EF, folder će se zvati Artist). Rešenje posle toga izgleda ovako:
Zatim ću uzeti List.aspx fajl i prekopirati ga u folder koji sam napravio. Posle toga, modifikacije postaju trivijalne, odnosno svode se na izmenu ASPX strane.
Postoji, doduše, jedan problem koji su pažljivi čitaoci verovatno mogli da predvide. Naime, ako ostavimo stvari kakve trenutno jesu, prilikom bildovanja rešenja će doći do gomile grešaka. List strana se kompajlira u List klasu, koje je označena kao partial, što znači da će se pojaviti dvostruke deklaracije polja i slične grešek. Da biste to izblegli, potrebno je da promenite namespace u codebehind i designer klasama, i da zatim u ASPX fajlu namestite Inherists atribut @Page direktive da pokazuje na tačan namespace i klasu u njemu.
Primera radi, želeo bih da izmenim način prikaza cele Artist tabele tako da sprečim GridView kontrolu da automatski generiše kolone i da umesto podataka svih kolona prikažem samo jednu, “Name”. Način da se to uradi je veoma prost. Prvo ću iskoristiti atribut GridView kontrole AutoGenerateColumns da isključim default ponašanje tako što ću vrednost staviti na “false”. Potom ću iskoristititi DynamicField kontrolu koja dolazi uz Dynamic Data. Svaka kolona koju želimo da prikažemo zahteva po jedan DynamicField; DynamicField koristi DataField atribut da bi znao koju kolonu da povuče iz modela. U mom slučaju, to je “Name”. Ceo kod izgleda:
1:
2: <asp:GridView ID="GridView1" runat="server" DataSourceID="GridDataSource"
3: AllowPaging="True" AllowSorting="True" CssClass="gridview" AutoGenerateColumns=false>
4: <Columns>
5: <asp:TemplateField>
6: <ItemTemplate>
7: <asp:HyperLink ID="EditHyperLink" runat="server"
8: NavigateUrl='<%# table.GetActionPath(PageAction.Edit, GetDataItem()) %>'
9: Text="Edit" /> <asp:LinkButton ID="DeleteLinkButton" runat="server" CommandName="Delete"
10: CausesValidation="false" Text="Delete"
11: OnClientClick='return confirm("Are you sure you want to delete this item?");' />
12: <asp:HyperLink ID="DetailsHyperLink" runat="server" NavigateUrl='<%# table.GetActionPath(PageAction.Details, GetDataItem()) %>'
13: Text="Details" />
14: </ItemTemplate>
15: </asp:TemplateField>
16: <asp:DynamicField DataField="TitleSrp" />
17: <asp:DynamicField DataField="Page" />
18: </Columns>
19:
20: <PagerStyle CssClass="footer"/>
21: <PagerTemplate>
22: <asp:GridViewPager runat="server" />
23: </PagerTemplate>
24: <EmptyDataTemplate>
25: There are currently no items in this table.
26: </EmptyDataTemplate>
27: </asp:GridView>
Jedan F5 kasnije možemo da proverimo da li naše izmene rade tako što ćemo kliknuti na Artists tabelu i videti da se sada lista samo ime umetnika, a ne i ostali podaci iz tabele u bazi podataka.
Naravno, Dynamic Data će nastaviti da prikazuje sve ostale tabele na isti način kao do sada. Ukoliko bi zahtev bio da se promeni listanje svake tabele, onda bismo priblegli prostijem rešenju a to je izmena List.aspx strane (i opstalih strana po potrebi) koje se nalaze u PageTemplates folderu.
Ukoliko iz nekog razloga se modifikacije ne vide a build greške ne postoje, proverite da li ste ispravno nazvali folder. Još jednom, ukolko koristite LINQ to SQL, folder je potrebno nazvati po imenu entiteta u množini. Ukoliko koristite Entity Framework, potrebno je nazvati po imenu entiteta u jednini.
Izmena field templates korisničkih kontrola
Menjanje PageTemplates fajlova je jedan od načina. Drugi način je izmena ili stvaranje novih templates koji služe za prikaz polja po tipu podataka.
Izmena ovih polja se verši veoma jednostavno, tako što se menja korisnička kontrola. Recimo da želim da pozadina polja za unos višelinijskog teksta (čitajte: textarea) bude žute boje, tekst crne boje, boldovan. Ovo mogu da izmenim ili kroz CSS fajl, što je jedna opcija, ali da bih pokazao primer, iskoristiću slične properties u samoj kontroli. Posle dodavanja potrebnih osobina, kod izgleda ovako:
1: <%@ Control Language="C#" CodeBehind="MultilineText_Edit.ascx.cs" Inherits="DynamicDataTest.MultilineText_EditField" %>
2:
3: <asp:TextBox ID="TextBox1" runat="server" CssClass="droplist" TextMode="MultiLine" Text='<%# FieldValueEditString %>' Columns="80" Rows="5" BackColor="Yellow" Font-Bold="true"></asp:TextBox>
Ova izmena će imati efekta na nivou celog UI-ja, dakle svako polje jkoje je tekstualno i za koje će se upotrebiti višelinijska kontrola za unos teksta će imati žutu pozadinu,.
Kuda dalje?
Kraj svakako ovde. Prvo, postoji još jedna moguća modifikacija, a to je kreiranje sopstvenih field templates. Recimo da želimo da napravimo naš kod koji će imati drugačiju validaciju za datetime tip podataka iz baze. Kada jednom napravimo naš field template, možemo ga registrovati i od tog trenutka, Dynamic Data će koristiti njega za rad sa kolonama iz baze podataka koja su tog tipa.
Druga mogućnost se ne tiče modifikacija per se, već drugog načina upotrebe Dynamic Data tehnologije. Ukoliko ste bacili pogled, tokom čitanja ovijh postova, na template strane koje doalze uz novi projekat, verovatno ste primetili da su tabele uglavnom predstavljenje kroz GridView kontrole. Ne postoji nikakva magija u svome ovome, to zaista jesu “samo obične” kontrole na koje smo navikli od ASP.NET-a 2.0. Dynamic Data donosi nove kontrole koje nam omogućavaju da dodamo “pametna” polja u GridView ili ListView (FormView itd.); ta polja nam daju mogućnost ne samo da imamo potpuno konfigurabilan način kako da prikažemo naše podatke, već da definišemo i koje želimo ili ne želimo da prikažemo, na koji način želimo da ih prikažemo i slično.
Više o ova preostala dva načina upotrebe Dynamic Data tehnologije će biti reči u sledećim postovima u seriji.
Out.
B.D.