środa, 20 stycznia 2010

No i Visual Studio 2010 Beta 2 sie popsuło. Samo :-(

UntitledZ tego co pamiętam, to zostało mi jeszcze ok 130 dni testów. Będę żądał zwrotu pieniędzy lub wymiany na nowe.

czwartek, 14 stycznia 2010

Mój ASP.NET MVC stack


Postanowiłem spisać technologie, biblioteki, które używam w pracy z projektami ASP.NET MVC, ewentualnie “nowinki”, które zostały przetestowane w boju, ale ze względu na silną obsadę czekają na lepsze czasy i napewdno niedługo zostaną przeze mnie ponownie użyte. Oto one, zaczynająć od "pierwszego składu":


Architektura

  1. S#arp Architecture: podstawowy stack, który zawiera w sobie wszystko to, co potrzebne jest do stworzenia aplikacji ASP.NET MVC. Korzysta z Castle.Windsor co podmieniam na Ninject.
  2. NHibernate, doskonale wszystkim znany ORM
  3. Linq2SQL, tam gdzie nie ma NHibernate :-)
  4. Fluent Nhibernate biblioteka konfiguracji NHibernate bez konieczności użycia plików XML oparty o konwencję / Fluent Interfaces.
  5. Ninject jako lekki framework DI / IoC.
  6. MVCContrib: projekt rozszerzający standardową funkcjonalność dostępną w gołym ASP.NET MVC
  7. jQuery, jQuery UI, jQuery plugins: biblioteka javascript, zbiór kontrolek JS, chyba każdemu znana.

Poczekalnia

  1. Entity Framework 4, jako zamiennik NHibernate. Zauważyłem, że EF idzie w całkiem fajną, ciekawą stronę umożliwiając MDD, dobrze integruje się z VS. Myślę, że niedługo będzie poważną alternatywą dla NHibernate.
  2. Spark View Engine, jako zamiennik standardowego view engine. Fajne rozwiązanie PartialViews, daje mniejszy bałagan w kodzie widoku.
  3. FubuMVC, framework implementujący wzorzec Front Controller
  4. MVCTurbine: “The whole purpose of MVC Turbine is to speed your MVC development by having the plug-in handle all churn of the runtime and allow you to focus on what your application needs to do, rather than how to do it.”

Coś byście dorzucili? :-)

środa, 13 stycznia 2010

Wzorzec “POST Redirect GET” w ASP.NET MVC

Jednym z największych problemów w aplikacjach internetowych jest podwójne przesłanie danych za pomocą metody POST na szczęście prawidłowo korzystając z mechanizmów ASP.NET MVC można się przed tym obronić – ale o tym za chwilę. Na początek krótkie wyjaśnienie tego w czym cały problem.

Wyobraźmy sobie formularz w którym podajemy: Numer karty kredytowej, datę jej ważności, kwotę w eurogąbkach, którą przelewamy na konto oraz przycisk “Wyślij”, czyli standardowy mechanizm płacenia za płatne treści (taaak wiadomo jakie :-) ) w Internecie.  Formularz w oparciu o metodę POST prześle dane do serwera, gdzie zostanie odpalona jakaś skomplikowana logika, którą nie będziemy się teraz przejmować. Efekt jest taki, że na naszym koncie mamy mniej eurogąbek niż mieliśmy jeszcze minutę temu. Wszystko pięknie, ale po drodze coś mogło pójść nie tak i nie otrzymaliśmy informacji zwrotnej, że przelew się udał. Co gorsza strona może prosić o odświeżenie znanym chyba każdemu użytkownikowi, najczęściej niepoprawnie zaimplementowanych stron, komunikatem:

com

Co zrobi przeciętny użytkownik? Tak: kliknie przycisk Prześlij ponownie. I to kosztowny błąd, bo na jego koncie jest dwa razy mniej eurogąbek.

Problem z formularzami wykorzystującymi metodę POST pojawia się gdy:

  1. Odświeżamy stronę.
  2. Zapisujemy stronę do Zakładek przeglądarki internetowej.

Rozwiązanie: PRG

Wzorzec projektowy PRG polega na:

  1. Przesłaniu formularza w sposób standardowy metodą POST.
  2. Przekierowanie, a ściślej mówiąc, zwrócenie kodu 303 / 302.
  3. Zażądanie załadowania “nowej” strony z użyciem GET.

PRG i ASP.NET MVC

Jak to się powinno zrobić w ASP.NET MVC? Służy do tego: znana chyba każdemu – a niestarty często nie do końca przez wszystkich zrozumiana metoda - RedirectToAction wraz z TempData przechowujący dane pomiędzy żądaniami.

[HttpPost]
public ActionResult Edit(InputData input)
{
if (ModelState.IsValid)
{
//jakas logika...
TempData["ResultMessage"] = "Transfer eurogabek zakonczony!";
return RedirectToAction("index");
}

return View(input);
}




Tak zaimplementowana logika nie spowoduje ponownego przesłania danych przy odświeżeniu strony i to właśnie tak powinny być zaprojektowane formularze korzystające z POST.