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

Poniżej rozwinięcie punktów z komentarzami i przykładami.

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.