Kao što sam juče napomenuo na user grupi, stavljam nekoliko linkova koji bi mogli značajno da pomognu ukoliko se odlučite da radite na upoznavanju ASP.NET MVC Framework-a.
Prvi korak je svakako preuzeti i instalirati Framework, što se radi od matičnog sajta, koji se nalazi na http://www.asp.net/mvc/. Zatim dolazi do pregledanja tutorial-a, koji se nalaze na http://www.asp.net/mvc./learn, logično. :))
Na prethodnom linku ćete naći dosta toga što može da pomogne, od tutoriala preko video fajlova do sample aplikacija. Preporuka je da, ukoliko se tek upoznajete sa MVC-em, preskočite sample aplikacije kao što su Kigg i sl., pošto su veoma konfuzne ukoliko niste zapamtili Fowlerove knjige napamet. Umesto toga, NerdDinner aplikacija i tutorial vezan za nju (http://nerddinnerbook.s3.amazonaws.com/) je odličan početak. Pred toga, Rob Conery je napravio i Storefront serijal, i njega preporučujem kao drugi korak.
Što se tiče blogova koje lično pratim, a koji imaju veze sa MVC-em, u pitanju su Scott Guthriev blog na prvom mestu (http://weblogs.asp.net/scottgu/); čovek je ipak napravio dotični framework in the first place, a ima i super kolekcije linkva koje se tiču ne samo MVC-a već i ASP.NET-a uopšte. Drugi jako bitan blog je Phil Haack-ov blog koji sam pominjao i juče (http://www.haacked.com/). Phil je Product (ili je to Program??) Manager u MVC timu, i najpozvaniji je da je ne samo ideje, već i vesti o novim features i sl. Treći blog na kome se nalazi dosta informacija je blog Stephena Walther-a (http://stephenwalther.com/blog/) na kome postoje i MVC tips & tricks, sjajna kolekcija malih saveta koji vam mogu pomoći. Rob Conery je zabavan za čitanje i inače (http://blog.wekeroad.com/), a njegov SubSonic možete da pogledate kao DAL projekat (mada je u verziji 3.0 dodao i Simple repository implementaciju koja izgleda kao OK rešenje).
Kada jednom sve ovo pogledate, buduće verzije i diskusije ASP.NET MVC-a se odvijaju na CodePlex-u na http://aspnet.codeplex.com/Wiki/View.aspx?title=MVC, dok se MVCContrib projekat nalazi na http://www.codeplex.com/MVCContrib.
Toliko od mene za ovo jutro.
Out.
B.D.
U prošlom postu je bilo reči o tome kako se Dynamic Data tehnologija može izmeniti, odnosno koje mogućnosti izmene OOB funkcionalnosti možemo da nađemo. Danas ću samo kratko proći kroz to kako se Dynamic Data može koristiti na postojećem sajtu, u postojećim “data aware” kontrolama kao što su GridView ili ListView. Naravno, negde usput ću objasniti i zašto bi neko želeo da uradi nešto slično.
Trenutno stanje u ASP.NET svetu
Trenutno, u ASP.NET svetu je stanje kontrola koje rade veliku većinu posla sa podacima veoma poznato i utemeljeno. Ukoliko želimo da imamo tabelarni prikaz podataka, stavićemo GridView, koji dolazi sa još nekoliko “sitnica”, kao što je automatsko parcelisanje podataka (popularni paging). ListView, nova kontrola u ASP.NET 3.5 ediciji, nam daje veću kontrolu nad HTML-om koji generišemo, ali je proces rada sa njom isti kao i sa drugim kontrolama. Ukoliko bismo posmatrali kod, onda bi to bilo:
1: public void Page_Load(object sender, EventArgs e){
2: if (!Page.IsPostback){
3: // konekcija, SQL komanda i sl. namerno izostavljeno
4: SqlDataReader reader = command.ExecuteReader();
5: GridView1.DataSource = reader;
6: GridView1.DataBind();
7: }
8: }
Ukoliko bismo posmatrali deklarativno, onda bi kod izgledao nekako ovako:
1: <asp:SqlDataSource ID="SqlDataSource1" runat="server"
2: ConnectionString="<%$ ConnectionStrings:AllThingsDemoConnectionString %>"
3: SelectCommand="SELECT * FROM [Characters]"></asp:SqlDataSource>
4: <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
5: DataKeyNames="ID" DataSourceID="SqlDataSource1">
6: <Columns>
7: <asp:BoundField DataField="ID" HeaderText="ID" InsertVisible="False"
8: ReadOnly="True" SortExpression="ID" />
9: <asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" />
10: <asp:BoundField DataField="Age" HeaderText="Age" SortExpression="Age" />
11: <asp:BoundField DataField="Rank" HeaderText="Rank" SortExpression="Rank" />
12: <asp:BoundField DataField="Service" HeaderText="Service"
13: SortExpression="Service" />
14: <asp:BoundField DataField="vID" HeaderText="vID" SortExpression="vID" />
15: <asp:BoundField DataField="aID" HeaderText="aID" SortExpression="aID" />
16: </Columns>
17: </asp:GridView>
Dakle, prvo odredimo SqlDataSource i podredimo koju komandu želimo da koristimo, zatim prevučemo GridView na stranu i povežemo ta dva…presto!, imamo tabelu sa podacima koja nam daje još neke pogodnosti kao što je gore navedeno.
Ono što nam ostaje kao problem, međutim, jeste što imamo ograničenu kontrolu nad tim poljima, kaok ona izgledaju, koju logiku imaju itd. Ako želimo da kontrolišemo prikaz, onda moramo da računamo na “petljanje” sa ListView kontrolom, što nije teško, naravno, ali onda bismo morali da sredimo nekako da ceo svoj sadržaj prikazuje u tabelama. S druge strane, isto tako, ukoliko bismo želeli da izmenimo definiciju kako nam se vide polja, kako izgledaju i sl., morali bismo da menjamo u svakom trenutku.
Slično je i sa ostalim databound kontrolama, kao što je ListView, recimo.
Enter Sandman, odnosno DynamicData
Ukoliko bih želeo da napravim malo lakše održiv GridView, mogao bih da iskoristim DynamicData <asp:DynamicField /> kontrolu za to.
Prva promena je, naravno, data source. Ako se podsetimo kako Dynamic Data radi, on ne radi direktno sa bazm već koristi ili Entity Framework objekte ili Linq To SQL objekte. Stoga moram da promenim data source iz gornjeg koda u LinqDataSource. Kada sam to jednom promenio, i naravno vezao GridView za bnovi DataSource element, potrebno je sve <asp:BoundField> kontrole promenim u <asp:DynamicField> kontrole. Sintaksa između njih je veoma slična, osim što mogu da izostavim SortExpression i HeaderText atribute. Kada jednom sve kolone koje želim, i koje sam odredio da su mi potrebne i vidljive, postavim na novi GridView, imam dinamički GridView koji je svestan modela, što je jedna prednost, i koje mogu da menjam centralno.
Sledeći put
Hteo sam da napišem ovaj blog post čisto da bih pokrio još jednu upotrebu Dynamic Data kontrola. Sledeći put ću pisati detaljnije o tome kako da koristite partial klase da biste na već postojeći model (vašeg postojećeg sajta) dodali podršku za Dynamic Data kontrole i tako iskoristili sve što one nude.
Out.
B.D.
Kao što sam obećao, ali sa malim zakašnjenjem, okačio sam PPT sa (veoma kratkim) pregledom developerskih novina u Windows-u 7 na SkyDrive odakle ga možete slobodno preuzeti.
Out.
B.D.
…u vrituelnu mašinu, i to Windows Virtual PC (http://www.microsoft.com/windows/virtual-pc/default.aspx), imao sam jednu simpatičnu grešku. Naime, pošto je instalcaija krenula, i installer završio sa instalacijom .NET Framework-a i krenuo sa instalacijom VSTS-a 2010, instalacija se prekinula sa greškom da je jedna CAB arhiva nevalidna. Konkretan error je bio Error 1300. Naravno, da sam VS2010 preuzimao sa interneta kao puno sitnih fajlova, ovo bi bilo sasvim moguće, ali u pitanju je bio jedan veliki ISO fajl koji je preuzet preko File Transfer Manager-a; on nije poznat po takvim greškama. Ipak, da otklonim svaku sumnju, proverio sam i checksum i slagao se sa objavljenim za ovaj fajl.*
Pošto je ISO fajl neoštećen stigao do mog računara, posumnjao sam da je u pitanju promena koja se mogla desiti tokom same instalacije, mada mi nije bilo jasno kako je to moguće…dok nisam “ukačio” da je ISO fajl na istom (eksternom) hdd-u kao i virtuelna mašina! Ugasio sam virtuelnu mašinu, prekopirao ISO fajl na desktop računara i opet pokrenuo instalaciju…koja je, naravno, sada prošla.
Ovaj post je čisto ukoliko i vi budete naletali na sličan problem, pa da vam se nađe kao savet.
Out.
B.D.
* – Ukoliko ikada naletite na ovakav ili sličan problem, postoji Microsoft alat koji se zove File Checksum Integrity Verifier (više o tome šta on radi ovde).