Zine.net online

Witaj na Zine.net online Zaloguj się | Rejestracja | Pomoc
w Szukaj

Bartek Szafko

MVC Contrib - wszystko czego brakuje w ASP .NET MVC

Do MVC istnieje świetny wspierający projekt społecznościowy MVCContrib.

Funkcjonalność zawarta w tym projekcie - bibliotece została podzielona na 7 obszarów:
  1. Helpery UI: wsparcie dla DataBinding, formularzy, walidacji danych, grida
  2. Fabryki kontrolerów - wsparcie dla mechanizmów Inversion of Control:Castle Windsor( z konkurencyjnego Monorail), Object Builder, Spring .Net, Structured Map
  3. Ścieżki(routing): Simply Restful Routing
  4. Kontrolery: klasa ConventionController
  5. Mechanizmy widoków: Brail, NHaml, NVelocity, XSLT
  6. Helper do tworzenia testów
  7. Narzędzia Hash: wsparcie wyrażeń lambda do tworzenia słowników

Databinding

Pozwala na używanie w akcjach obiektów, jako parametrów:

    1 public ActionResult New([Deserialize("shipment")] Shipment newShipment)

    2 {

    3     return View("new", newShipment);

    4 }


Klasa shipment może być nawet złożona:

    1 public class Shipment

    2 {

    3     public Address ShipTo { get; set; }

    4     public Dimension Dimensions { get; set; }

    5 }

    6 

    7 public class Address

    8 {

    9     public string Name { get; set; }

   10     public string StreetAddress { get; set; }

   11     public string City { get; set; }

   12     public string StateProvince { get; set; }

   13     public string ZipPostalCode { get; set; }

   14     public string Country { get; set; }

   15 }

   16 

   17 public class Dimension

   18 {

   19     public UnitOfMeasure Units { get; set; }

   20     public double Length { get; set; }

   21     public double Width { get; set; }

   22     public double Height { get; set; }

   23 }

   24 

   25 public enum UnitOfMeasure

   26 {

   27     English,

   28     Metric

   29 }


Jest to szczególnie przydatne, gdy tworzy się klasy typu ViewData używane tylko w warstwie prezentacji, które głębiej są np encjami Linq To Sql, ciekawe jak w tym miejscu dałoby się zastosować Entity Framework na bazie Linq2Sql... Trzeba to będzie sprawdzić.

Walidacja

Implementowana w całości w widkoach, istnieje możliwość podpięcia własnych javascriptów wykonywanych u klienta. To podejście muszę przyznać jest o wiele lepsze niż to, które jest stosowane w MVC Validator Toolkit, chociaż byłem jego zdecydowanym orędownikiem.

Fabryki kontrolerów

Praktycznie wszystkie popularniejsze zostały sprzęgnięte z MVC o każdym z nich można by napisać książkę, więc podaje tylko linki do projektów źródłowych:

REST

Representational state transfer (REST) jest wzorcem definiowania adresów w aplikacjach webowych, który w praktyce sprowadza się do użycia 7 albo 8(liczba zależy od implementacji w RoR jest np 7) domyślnych akcji: Index, Show, Edit, Delete, New, Create, Update, Destroy. MvcContrib zawiera SimplyRestfulRouteHandler, który pozwala na szybkie zaimplementowanie tego wzorca. Kevin zrobił ładny przykład polecam.

ConventionController

Implementuje szereg rozszerzeń do standardowej klasy Controller:

  • Atrybut DefaultAction, który pozwala określić akcję wykonywaną gdy nie znaleziono akcji o podanej nazwie:

        1 [DefaultAction]

        2 public ActionResult DefaultAction()

        3 {

        4     string originalAction = RouteData.Values["action"].ToString();

        5     return Content(string.Format("You tried to access action '{0}' but it does not exit.", originalAction));

        6 }



  • Obsługa błędów zrealizowana za pomocą atrybutu Rescue zarówno dla klasy jak i akcji, zrobiony na podobnej zasadzie jak RoR:

        1 [Rescue("Error")]

        2 public ActionResult ToTheRescue()

        3 {

        4     throw new InvalidOperationException();

        5 }



    Można określić również jakie wyjątki mają zostać obsłużone:

        1 [Rescue("DivideByZero", typeof(DivideByZeroException))]

        2 public ActionResult DivideByZero()

        3 {

        4     int j = 5;

        5     int f = 0;

        6     int y = j / f;

        7     return null;

        8 }



    Można się również dostać z poziomu widoku do szczegółów wyjątku.
  • Filtry - pozwalają dostać się do akcji tylko w określonym przypadku np: tylko z metody POST(używając przycisku wyślij w formularzu):

        1 [PostOnly]

        2 public ActionResult Save(string name)

        3 {

        4     return View();

        5 }

Widoki

MVCContrib pozwala na użycie tak odjechanych mechanizmów do prezentacji jako np NHaml. Generalnie co kto lubi, ale jak do tej pory do mnie i tak najbardziej przemawiają zwykłe webformsy jako widoki.

Helper do tworzenia testów

Pomaga przede wszystkim w odpowiedniej inicjalizacji kontekstów związanych z serwerem www jak HttpContext, HttpRequest, HttpResponse, HttpSession, Form, TempData, QueryString, AplicationPath, PathInfo. Z doświadczenia a właściwie autopsji wiem, że np odpowiednie zmockowanie może zająć trochę czasu. Dodatkowo contrib zapewnia proste metody na sprawdzenie wyników typu RedirectToAction:

    1 [Test]

    2 public void AddFormStarShouldRedirectToList()

    3 {

    4     _controller.AddFormStar().AssertActionRedirect().ToAction("List");

    5 }

Hash z lambda

Tutaj dużo komentarza nie potrzeba:


IDictionary dictionary = new Hash(id => "foo", @class => "bar", name => "foobar");


Co można by zapisać jako:


IDictionary dictionary = new HybridDictionary();

dictionary.Add("id", "foo");

dictionary.Add("class", "bar");

dictionary.Add("name", "foobar");

Podsumowanie

MvcContrib można ściągnąć z Codeplex.

A ja jeszcze dodatkowo zachęcam do przesłuchania podcasta Scotta Hanselmana o tym jak się ma projekt Contrib do samego MVC oraz co o tym wszystkim myślą autorzy monorail.

Artykuł ukazał się także na blogu Bartka Szafko
Opublikowane 19 czerwca 2008 21:35 przez bszafko

Komentarze:

 

lolbro said:

Bardzo fajny tekst. Nie sądziłem, że wspomniane projekty, w szczególności ASP MVC, MVC Contrib i Spring .NET tak fajnie się rozwijają. Troszkę zmieniłem działe i nie mam już z nimi takiej styczności jak wcześniej. Jednak dzięki Twoim artykułom mogę być na bieżąco. Czekam na kolejne artykuły z serii....

czerwca 20, 2008 14:21
 

bszafko said:

dzięki za pozytywny odzew :)

o MVC na pewno jeszcze będę pisał, jest to aktualnie mój konik

czerwca 20, 2008 21:13
 

Luke said:

Z MVC Contrib nie korzystam (dużo przydatnych funkcji.. jednakże dla żadnej nie znalazłem na razie zastosowania w swoim projektach :P), jednak jest jeszcze sporo rzeczy, których mi brakuje w MVC jak choćby w widokach prosta metoda RenderToXML (w Preview 3 byłoby to już inaczej ;)) czy jakieś banalne skrypty typu scaffold z RoR-a... Więcej o tym, czego mi brakuje będzie jutro na moim blogu :)

czerwca 21, 2008 00:12
Komentarze anonimowe wyłączone
W oparciu o Community Server (Personal Edition), Telligent Systems