Do MVC istnieje świetny wspierający projekt społecznościowy MVCContrib.
Funkcjonalność zawarta w tym projekcie – bibliotece została podzielona na 7 obszarów:
- Helpery UI: wsparcie dla DataBinding, formularzy, walidacji danych, grida
- Fabryki kontrolerów – wsparcie dla mechanizmów Inversion of Control:Castle Windsor( z konkurencyjnego Monorail), Object Builder, Spring .Net, Structured Map
- ?cieżki(routing): Simply Restful Routing
- Kontrolery: klasa ConventionController
- Mechanizmy widoków: Brail, NHaml, NVelocity, XSLT
- Helper do tworzenia testów
- 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.