Klávesové zkratky na tomto webu - rozšířené Na obsah stránky

REST aplikace pomocí ASP.NET MVC

11.20 - 26. října 2008 | ASP.NET 2.0

Jednou z důležitých novinek v beta verzi ASP.NET MVC je bezesporu možnost přetěžování akcí a ve spolupráci s filtry na typ požadavku můžeme přejít na REST přístup k architektuře webové aplikace.

Ačkoli si mnoho lidí myslí, že když píšou v ASP.NET MVC, mají rovnou REST out of the box, není tomu tak. V plném RESTu se totiž nedostávají do URL slovesa (akce), nýbrž pouze předměty. Typický scénář CRUD operací může vypadat následovně:

POST /Customers/Create/
GET /Customers/Detail/1
POST /Customers/Update/1
GET /Customers/Delete/1

Takovéto akce snadno pokryjeme s výchozí routou /{controller}/{action}/{id} a řadič CustomersController může vypadat nějak tak:

public class CustomersController : Controller {
  public ActionResult Create(Customer customer) {
    // TODO: create customer
  }

  public ActionResult Detail(int id) {
    // TODO: find customer by id
  }

  public ActionResult Update(int id, Customer customer) {
    // TODO: update customer
  }

  public ActionResult Delete(int id) {
    // TODO: delete customer
  }
}

Jenže POSTování a GETování je jen slabou podmnožinou povolených operací na HTTP protokolu. Správný REST přístup pro CRUD operace by měl vypadat následovně:

POST /Customers
GET /Customers/1
PUT /Customers/1
DELETE /Customers/1

Co je pro to třeba udělat?

Začneme od routy. Přidáme novou routu pro CustomersController:

routes.MapRoute(
  "REST Customers",
  "Customers/{id}",
  new { controller = "Customers", action = "Rest", id = "" }
);

A původní kód obohatíme o pár atributů:

public class CustomersController : Controller {
  [ActionName("Rest")]
  [AcceptVerbs(HttpVerbs.Post)]
  public ActionResult Create(Customer customer) {
    // TODO: create customer
  }

  [ActionName("Rest")]
  [AcceptVerbs(HttpVerbs.Get)]
  public ActionResult Detail(int id) {
    // TODO: find customer by id
  }

  [ActionName("Rest")]
  [AcceptVerbs(HttpVerbs.Put)]
  public ActionResult Update(int id, Customer customer) {
    // TODO: update customer
  }

  [ActionName("Rest")]
  [AcceptVerbs(HttpVerbs.Delete)]
  public ActionResult Delete(int id) {
    // TODO: delete customer
  }
}

A máme REST :)

Autor: Aleš Roubíček | 10x komentováno | del.icio.us | Linkuj!

K WebExpu ještě jednou a pořádně

16.19 - 25. října 2008 | Webdesign

Už je to týden, co nám skončila přednáška o ASP.NET 3.5 / futures na konferenci WebExpo 2008. Rád bych se k této konferenci ještě ohlédl.

Moje prezentace

Když mě začátkem léta oslovil Vašek Stoupa, jestli nechci přednášet o ASP.NET MVC na WebExpu, měl jsem zprvu strach. Nikdy jsem veřejně nepřednášel a z malých slideshow, které jsem dělal pro kolegy nebo ve škole, jsem si byl jistý, že mé prezentační schopnosti nejsou skoro žádné. Ale pak jsem si řekl, že zkusit bych to mohl, přinejmenším je to dobrá zkušenost a raději jsem požádal Borka, aby se ke mně přidal. Proč? Protože už jsem ho viděl přednášet na WebCampu a bylo to dobré.

Takže jsme se domluvili, že přednáška bude mít trochu širší záběr než jen ASP.NET MVC, které v té době bylo pouze v ukázkových verzích. V průběhu září jsme vymysleli nějakou osnovu, Borek založil SVN repository a začali jsme připravovat prezentaci.

Nejprve jsem udělal ukázku na využití ADO.NET Data Services ve spolupráci s ASP.NET AJAX (tu najdete přibalenou). Krom toho, že ukazuje základy konzumace RESTových Data Services, tak je i hezkou ukázkou toho, jak takové služby stavět nejen nad Entity Frameworkem, ale i nad ActiveRecord/NHi­bernate. No, ukázka není úplně dokončená, protože jsem se jí přestal věnovat a už jsem nenašel chuť jí dokončit, ale základní koncepce je snad pochopitelná – snažil jsem se vše okomentovat.

Osobně nemám rád psaní zbytečného kódu. Nejsem zastáncem zbytečných ukázkových aplikací, testovacích utilitek a tak. Takže už jsem žádné další ukázkové aplikace nepsal a rozhodl se další možnosti ASP.NET ukázat na již hotových aplikacích, se kterými mám něco společného.

Základní koncept komponent a Master pages jsem se tedy rozhodl ukázat – ať nechodíme daleko – na šabloně tohoto blogu. O něco pokročilejší komponentový framework jsem pak ukazoval na šabloně obchody.atlas.cz. Tahle jedna šablona je v podstatě celý web. Bez knihovny je sice mrtvá a ještě chyběj pravidla URL rewritingu, ale jinak je tam vše. Tyhle dvě ukázky najdete taktéž přibalené.

Poslední mou ukázkou byla aplikace, kterou jsem psal kvůli potřebě naučit se ASP.NET MVC a ADO.NET Data Services prakticky ještě před konferencí a zároveň abychom se v práci zbavili nutnosti zapisovat si příchody někam na papír (formulář) a pak na konci měsíce počítat, kolik kdo dostane stravenek :). Tak vznikla docházka a taky rozcestník projektů a tím pádem základ Twareg.Intranet. Shodou okolností to možná bude i naše první komerčně prodávaná aplikace. Hezký osud bokovky…

Takže na tomto webu jsem se pokusil ukázat, jak se dělá routing, jak je ten systém modulární. Jak deklarativně pomocí atributů nastavit autorizaci k akcím a jak akce snadno přejmenovat. Na víc už moc nezbýval čas. Tahle ukázka přibalená není. Namísto ní najdete Borkovy REST služby postavené nad ASP.NET MVC, které jsme bohužel nestihli ukázat.

Co se týče mého vystoupení, tak moc spokojený nejsem, vůbec se to nedostalo ani na spodní hranici mých představ o dobré přednášce – naštěstí tam byl Borek, aby to zachránil.

Author Stream ty slajdy trochu rozsypal, ale lepší než nic. Jinak pokud si chcete slajdy nebo ukázky stáhnout, pokračujte na Slajdy a ukázky z WebExpa. Pokud vás toto téma zajímá určitě najdete spoustu zajímavých futures bits na Codeplexu. Některá témata z přednášky bych rád rozebral podrobněji tady na blogu, ale až někdy jindy.

Shlédnuté prezentace

Na WebExpu jsem naštěstí nebyl jen jako pokus o přednášejícího, ale i jako divák. Oproti původnímu plánu jsem nakonec navštívil trochu jiné přednášky. Jako opravdu výbornou můžu označit přednášku Juraje Michálka o Flexu. Hodně dobrá byla nejspíš i Karmiho přednáška o Ruby on Rails, ale zastihl jsem jen asi posledních 25 min. Přednáška o Nette z úst nejzasvěcenějšího byla zábavná, nicméně s plánovaným školením PHP frameworky na paměti značně zredukovaná.

Mezi pro mě obsahově hodnotné a pořád dobře odprezentované bych ještě rád zařadil Dagiho přednášku o Springu, přednášku Vlastimila Pečínky o architektuře v Seznamu a přednášku o SproutCore od Antonína Hildebranda. Sice jsem nedostal odpověď na otázku, jestli to funguje i bez JavaScriptu, ale i tak přednášku hodnotím jako přínosnou a můžu rubistům tiše závidět ;).

Sociální vlivy

Na tuhle akci jsem nejvíc těšil hlavně kvůli lidem. Já moc na tydlety akce nechodím, ale jednou za čas se potkat s lidmi, které často čtu, není špatné. Rád jsem osobně potkal i některé nové tváře, které jsem dosud nečetl a třeba to napravím…

Na závěr

Na závěr patří především velíké díky Vaškovi, za velikou zkušenost, za zorganizování téhle veliké party se spostou zajímavých osobností a se širokým záběrem témat. Je dobré když se člověk může podívat na to jak to dělaj jinde a něčemu se třaba přiučit nebo prodiskutovat své pohledy na věc. Ono táhnout konferenci až do první hodiny ranní není žádná sranda. Respekt!

Jo a málem bych zapomněl, na LinkedIn jsem vytvořil k této konferenci skupinu, takže pokud jste se ještě do ní nepřidali, neváhejte a udělejte to ještě teď. A pokud vás zajímají slajdy ostatních nebo chcte nasdílet své, využijte eventu na slide share.

Autor: Aleš Roubíček | 1x komentováno | del.icio.us | Linkuj!

Slajdy a ukázky z WebExpa

12.58 - 19. října 2008 | Webdesign

Konečně jsem se dostal k tomu abych nahrál slajdy z naší přednášky na web.

Tady tedy jsou:

Autor: Aleš Roubíček | 11x komentováno | del.icio.us | Linkuj!

What's Up?

15.38 - 16. října 2008 | Webdesign

Možná si říkáte, tady to umřelo, nic se neděje. Možná máte pravdu. Je to tím, že poslední dobou toho mám docela dost. Krom příprav na sobotní přednášku, jsem se musel věnovat shánění a následnému stěhování a nyní už i zařizování, což mě docela vytěžuje. :) Navíc v novém bytě ještě nemám zaveden internet, tak jsem téměř mužem v off-linu.

K příležitosti WebExpa jsem si vytvořil kalendář, kde bych se chtěl nejspíš pohybovat, uvidíme, jak to nakonec dopadne.

No a když už se to tak blíží, tak Microsoft nezapoměl vydat beta verzi ASP.NET MVC o němž chceme s Borkem povídat. Neni to jediný release před konferencí, například vyšel i Silverlight 2 o němž bude po nás povídat Štěpán Bechynský.

Vzhledem k tomu, že změny mezi Preview 5 a Beta verzí nejsou nikterak veliké (stačí pár drobných úprav, aby vše opět běželo jak má, budeme na přednášce tedy ukazovat už Betu. Já už jsem převedl moji ukázkovou aplikaci. Ta bude aplikace našeho tuaregského intranetu, takže žádná ukázková spatlanina, ale aplikace z reálného života. Dobré je, že na ní můžu ukázat jak ASP.NET MVC, tak ADO.NET Data Service, které v projektu také používám.

Tak pokud budete na WebExpu, tak mě nezapomeňte přijít pozdravit ;)

Autor: Aleš Roubíček | 1x komentováno | del.icio.us | Linkuj!

Stack Overflow - sociální studnice znalostí pro vývojáře

17.29 - 19. září 2008 | ASP.NET 2.0

Tento týden byla spuštěna do veřejného beta provozu nová studnice znalostí pro vývojáře s romantickým názvem Stack Overflow.

Tento web se veze na sociální vlně. Je to kombinace FAQ, Wiki a Diggu. Umožňuje hlasování o relevantnosti odpovědí, tagování, gravatary, komentáře, prostě všechny tydlety cool 2.0 věci. Zatímto zajímavám počinem pro vývojáře stojí dvě docela známé a uznávané osobnosti v blogosféře a to Jeff Atwood (Coding Horror) a Joel Spolsky (Joel on Software).

Tak honem šup šup se na něco zeptat nebo odpovědět, úspěch této aplikace závisí pouze na dostatečně relevantích přispěvatelích.

PS. technická poznámka, celé je to postaveno pomocí ASP.NET MVC frameworku.

Autor: Aleš Roubíček | Zatím bez komentáře | del.icio.us | Linkuj!

URL Routing v ASP.NET – část první

10.56 - 7. září 2008 | Webdesign

První vlašťovkou z hnízda MVC frameworku, která se objevila v produkční verzi .net frameworku, je knihovna System.Web.Routing. Objevila se s příchodem SP1 verze 3.5 a to proto, že jí využívají ASP.NET Dynamic Data, které jsou taktéž novinkou service packu. No a protože routing je důležitou součástí ASP.NET MVC a jeho výhod lze využít i v klasickém ASP.NET, pojďme se na něj podívat trochu blíž.

Jak to funguje

Základem routingu je HttpModul, který vezme URL adresu požadavku a snaží se ho napárovat na některou z rout, které se registrují při startu aplikace. Pokud najde, získá z adresy požadované parametry a předá zpracování patřičnému RouteHandleru, který má za úkol vytvořit HttpHandler a předat mu získaná data. V případě MVC se vytvoří MvcHttpHandler a data se přidávají kontextu, v klasickém ASP.NET je to jen na vás.

Routovací handler pro WebForms může vypadat třeba následovně:

public class WebFormRouteHandler<T> : IRouteHandler where T : IHttpHandler, new() {
  public string VirtualPath { get; set; }

  public WebFormRouteHandler(string virtualPath) {
    VirtualPath = virtualPath;
  }
  public IHttpHandler GetHttpHandler( RequestContext requestContext ) {
    foreach (var value in requestContext.RouteData.Values) {
      requestContext.HttpContext.Items[value.Key] = value.Value;
    }

    return (VirtualPath != null)
      ? (IHttpHandler)BuildManager.CreateInstanceFromVirtualPath(VirtualPath, typeof(T))
      : new T();
  }
}

Routovací handler projde kolekci dat získaných z aktuální URL požadavku, nacpe je do kontextu a nakonec vytvoří a vrátí IHttpHandler.

Routovací tabulky

Pro naše aplikace je asi nejdůležitější nadefinovat routovací tabulky. Definice tabulky se vytváří při startu aplikace, tudíž využijeme události Application_Start v Global.asax nebo vlastním HttpModulu.

public class MvcApplication : System.Web.HttpApplication {
  public static void RegisterRoutes(RouteCollection routes) {
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    routes.MapRoute(
        "Default",                                              // Route name
        "{controller}/{action}/{id}",                           // URL with parameters
        new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
    );
  }
  protected void Application_Start() {
    RegisterRoutes(RouteTable.Routes);
  }
}

Ukázka tvorby routovací tabulky při startu webové aplikace. Metoda MapRoute je extension metodou z MVC frameworku, která za nás vytvoří MvcHttpHandler, který bude požadavek zpracovávat. Získané parametry z routy jsou: název řadiče, který přebere řízení, jeho akce, která požadavek zpracuje a dále pak parametr id.

U WebForms by routovací tabulka např. pro můj blog mohla vypadat následovně:

public class Global : System.Web.HttpApplication {
  public static void RegisterRoutes(RouteCollection routes) {
    var routeHandler = new WebFormRouteHandler<Page>("~/Weblog/Article.aspx");
    var route = new Route("weblog/{id}-{url}.aspx", routeHandler) {
      Constraints = new RouteValueDictionary {
       {"id", "\d{1-3}"}
     }
    };
    routes.Add(route);
  }
  protected void Application_Start(object sender, EventArgs e) {
    RegisterRoutes(RouteTable.Routes);
  }
}

Zaregistroval jsem do tabulky routu, která bere URL ve tvaru weblog/{id}-{url}.aspx a ověřuje se, že id je jedno až tříciferné číslo.

Shrnutí

„Pane Aloisi, když dovolíte, já bych si to v závěru celé shrnul.“

„Tak, jestli vám to udělá dobře, tak si to celý schrntě.“

Tak tedy, tento spotík se snažil nastínit jak funguje routing v ASP.NET, jak si zaregistrovat routy a jak z nich získávat data. Mohlo by se zdát, že to je vše čeho jsme schopní dosáhnout, ale není tomu tak. Routing je v ASP.NET dvoucestný, ale cestu zpět si ukážeme zas někdy příště… Třeba na WebExpu!

Tagy: , ,

Autor: Aleš Roubíček | 2x komentováno | del.icio.us | Linkuj!

Povídání o ASP.NET na WebExpu

19.38 - 4. září 2008 | Webdesign

Je to už pár měsíců, co mě oslovil Vašek Stoupa, zda bych nechtěl přednášet na WebExpuASP.NET MVC. WebExpo 2008 Zprvu jsem váhal, protože nemám žádné prezentační zkušenosti a tak jsem to chtěl celé hodit na Borka. Jenže pak jsem si vzpomněl na skvělé přednášky z MIXu, kde nebyl pouze jeden přednášející, ale tandem.

Slovo dalo slovo, Vašek i Borek souhlasili a my jsme zapsaní v programu konference. :) Protože ASP.NET MVC ještě není ve stabilní formě API (ta by měla být více méně stabilní v betafázi, která se blíží), domluvili jsme se na tom, že probereme více věcí.

Doufám, že se Borek nebude zlobit, když prozradím naši předběžnou osnovu. Můžete se k ní vyjádřit v komentářích a my ji můžete případně vylepšit. :)

Osnova

  1. WebForms – povídání o tom, kde je vhodné použít klasické WebForms a novinkách ve verzi 3.5
  2. AJAX – povíme si, jak je integrována podpora AJAXu v ASP.NET
  3. ADO.NET Data Service – bližší seznámení s REST službami postavenými nad ADO.NET a ukázka ve spojení s AJAXem
  4. Dynamic Data – povídání a ukázka dynamicky vytvářených administračních rozhraní ze schématu databáze.
  5. MVC – povídání a ukázka MVC frameworku, jak se liší od WebForms a možná i spojení s Dynamic Data, to jak zbyde čas.

Pokud vás tato témata zajímají, přijďte se na nás podívat, pokud nezajímají, přijďte se podívat na koktajícího rarouše… ;) Každopádně tam bude spousta jiných zajímavých přednášek, třeba Davidův evergreen o Nette Frameworku.

Tagy: , ,

Autor: Aleš Roubíček | 5x komentováno | del.icio.us | Linkuj!

Using pattern

15.32 - 14. dubna 2008 | ASP.NET 2.0

Je tomu již dlouhá doba, co jsem psal spotík o užívání bloku using v jazyce C# pro třídy implementující rozhranní System.IDisposable. Tohoto bloku se dá využít k logickému členění kódu do bloků a vytvořit tak syntax sugar na úrovni API.

Ukázky užití

S using patternem se v moderních API dá potkat celkem často. První ukázka je z mockovacího frameworku Rhino Mocks. Používá se pro nahrávání a přehrávání chování mockovaného objektu.

MockRepository mocks = new MockRepository();
IDependency dependency = mocks.CreateMock<IDependency>();

using(mocks.Record()) {
    Expect.Call(dependency.GetSomething("parameter")).Return("result");
    dependency.DoSomething();
}

using(mocks.Playback()) {
    Subject subject = new Subject(dependency);
    subject.DoWork();
}

Using pattern usnadňuje čtení takovéhoto kódu a hned je jasná i logická struktura.

Další ukázka pochází z ASP.NET MVC frameworku, kde se using pattern používá v HTML helperu pro generování formuláře.

<% using(Html.Form<HomeController>(action => action.Index())) { %>
...
<% } %>

Implementace

Základem, tedy, je blok using, který slouží k bezpečnému zavolání metody Dispose objektu implementujícího rozhranní System.IDisposable. Jak na to, když v using bloku předáváme metodu a ne objekt? Jednoduše, musíme vrátit v metodě objekt, který se o špinavou práci postará. V podstatě ani nemusí být nijak inteligentní.

public class UsingPattern : IDisposable {

  private WorkerMethod _method;

  public delegate void WorkerMethod();

  public UsingPattern(WorkerMethod method) {
    _method = method;
  }

  public void Dispose() {
    _method();
  }
}

Užití v našem API je pak celkem triviální.

public class SomeClass {
  public UsingPattern SomeMethod() {
    Console.WriteLine("Zacatek bloku");
    return new UsingPattern(() => Console.WriteLine("Konec bloku"));
  }
}

public class OtherClass {
  public void Consumer() {
    var some = new SomeClass();

    using (some.SomeMethod()) {
      Console.WriteLine("Blok");
    }
  }
}

Tagy: ,

Autor: Aleš Roubíček | Zatím bez komentáře | del.icio.us | Linkuj!

Jak je to s tím seriálem?

09.58 - 2. února 2008 | ASP.NET 2.0

Před Vánocema jsem slíbil seriál o tom, jak napsat redakční systém nad ASP.NET MVC pomocí TDD. Mám pár dílů na disku, tak proč nejsou venku?

No při psaní jsem narazil na pár problémů, ať je to ještě nezralost ASP.NET MVC, nedostatek času a tak. Rozhodně však nejde o další mrtvý projekt. Pokusím se ho dopsat společně s návazností na NForms a CSSX, protože to jsou věci, od kterých si slibuju mnohem jednodušší a rychleší tvorbu webíků.

Ale psát kód a zároveň tvořit článek, kterému by rozuměl i macík, je dost časově náročné. A protože musim chodit občas pařit, nebou skouknout nějakej ten film a nebo prostě jenom relaxovat, tak asi blognu až jenom finál…

Přišli jste sem z RSS čtečky? Zkontrolujte si prosím, zda máte správnou URL feedu http://feeds.feedburner.com/rarous-weblog. Děkuji

Autor: Aleš Roubíček | Zatím bez komentáře | del.icio.us | Linkuj!

Redakční systém na ASP.NET MVC

18.56 - 23. prosince 2007 | Webdesign

Rozhodl jsem se, že, jako praktickou ukázku použití TDD a ASP.NET MVC (dále jen MVC), budu psát seriálek, výsledkem něhož bude základ třetí verze redakčního systému Gryphoon.

Upozornění: Je možné, že některým věcem nebudete v průběhu čtení rozumět. Dopuručuji si přečíst související články, na jejichž základě tento seriál staví.

Už z této podstaty vyplívá, že půjde o OSS. Projekt je hostován na Codeplexu pod MS-PL. Dalším důležitým znakem je použití Texy.net jako základního kamene systému, spojení s databází bude zajišťovat Castle ActiveRecord, pro testování použiji xUnit.net a Rhino Mocks. Tím jsou nastíněny základní prvky architektury a můžeme se pomalu dát do práce.

Struktura projektu

Prozatím to vypadá na tři projekty v řešení:

  1. Rarous.Gryphoon – Knihovna, jádro systému, které bude obsahovat objekty doménového modelu, konfiguraci a další potřebné komponenty.
  2. Rarous.Grypho­on.Spec – Knihovna s jednotkovými testy. xUnit.net místo termínu test používá fakt, proto bude brát tento projekt jako specifikaci zbylých částí.
  3. Rarous.Grypho­on.Web – Webová aplikace. Projekt bude obsahovat webovou část tj. Controllery a View (řadiče a pohledy) a Helpery (pomocníky).

První řádky specifikace

Naší jedinou specifikací bude projekt Rarous.Grypho­on.Spec. Tím co je v něm dáno, by se měly řídit oba zbylé projekty. Dobrým zvykem v TDD je navrhovat systém od shora dolů. První věc, se kterou přijdete do styku, je URL. Zatím nebudu výchozí schéma URL měnit, proto ani nebudu psát testy na Routování (zatím). Defaultní schéma URL by mělo být už milionkrát otestované v rámci MVC projektu.

Takže budeme pokračovat dál a to k řadiči článku (ArticleController). Ten by měl být zodpovědný za vytváření článků nových, jejich následnou editaci, zobrazování a v poslední řadě i mazání.

V prvním CTP, zatím nejsou předdefinované Mock Objekty pro controllery, proto použijeme Test subclass pattern, pro ověření činnosti controlleru. Controller bude mít následující rozhranní:

Diagram IArticleController

A třída pro testování vypadá následovně:

public class TestArticleController : ArticleController {
  public string ActualViewName { get; set; }
  public string RedirectViewName { get; set; }
  public string ActualMasterName { get; set; }
  public object ActualViewData { get; set; }

  protected override void RenderView(string viewName, string masterName,
                                     object viewData) {
    ActualViewName = viewName;
    ActualMasterName = masterName;
    ActualViewData = viewData;
  }

  protected override void RedirectToAction(object values) {
    RedirectViewName = values.ToDictionary()["Action"];
  }
}

Teď můžeme napsat první test, který ověří, že pokud přijdeme na adresu /article/ otevře se nám editor nového článku. Pozn. Využívám výchozího schématu routeru [controller]/[action]/[id] -Pokud není action definovaná vybere se Index. V budoucnu ho změním na lepší, ale pro začátek stačí.

[Fact]
public void ArticleController_DefaultActionShouldShowEditor() {
  TestArticleController controller = new TestArticleController();

  controller.Index();

  Assert.Equal("Editor", controller.ActualViewName);
}

Spustíme test – neprojde. Aby test prošel, musíme doimplementovat metodu ArticleController.Index.

[ControllerAction]
public void Index() {
  RenderView("Editor");
}

Teď už by měl test projít. Jenže aby to fungovalo i na webu, musíme ještě dopsat View /Views/Article/Editor.aspx… Do příště za domácí úkol.

Závěrem

Aktuální stav je na codeplexu ke stažení, ale zdaleka není funkční. :) Průběžně ho budu s dalšími díly doplňovat. Příště tedy uděláme ukládání nových příspěvků a editaci. Když se pozorně podíváte na zdrojáky, zjistíte, že tak trochu cheatuju :)

Jo abych nezapoměl, pokud jste sem přišli přes RSS a ještě jste si nezměnili adresu feedu, učiňte tak zavčasu. Děkuji

Související

Tagy: ,

Autor: Aleš Roubíček | 9x komentováno | del.icio.us | Linkuj!