Zine.net online

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

Bartek Szafko

  • ASP .NET MVC Preview 5 - po cichu

    Dzisiaj, bez większych fanfarów, pojawił się preview 5 ASP .NET MVC.

    Tak na szybki ogląd release notes widać, że _WRESZCZIE_ dodano obsługę RenderPartial.

    Chociaż muszę przyznać, że dodany AJAX mi się nie podoba (przynajmniej na podstawie paru tutoriali, które widziałem), nadal wolę jQuery.

    Dodano też obsługę własnych binderów do atrybutu ModelBinder, co akurat cieszy.

    Release na codeplex i pełna lista zmian, niestety na razie bez source'ów.

    Jest jeszcze forum na którym można wylewać swoje żale ;)

    Bartek Szafko
    opublikowano 29 sierpnia 2008 13:02 przez bszafko | 2 komentarzy
    Filed under:
  • A to mój harmonogram na MTS 2008

    Michał był pierwszy :)

    Część z naszego wyboru się pokrywa:

    Środa

    07:30 - 09:30 Rejestracja
    09:30 - 11:00 Sesja generalna (otwierająca)
    11:00 - 11:20 Przerwa kawowa
    11:20 - 12:35 Wydajne aplikacje ASP.NET w świecie Web 2.0 Tymoteusz Chmielewski
    12:35 - 13:35 Lunch
    13:35 - 14:50 Praktyczne aspekty budowania rozwiazań klasy Enterprise z wykorzystaniem produktów Microsoft Patterns and Practices Marcin Sieradzki
    14:50 - 15:10 Przerwa kawowa
    15:10 - 16:25 .NET bez wizardów ? sposoby tworzenia i dynamicznego aktywowania komponentów w aplikacjach Bartosz Pampuch
    16:25 - 16:45 Przerwa kawowa
    16:45 - 18:00 TFS - praktyka Bartosz Celmer

    Czwartek

    07:30 - 09:00 Rejestracja
    09:00 - 10:15 Bezpieczeństwo serwisów WWW ? praktyczne uwagi o implementacji zaleceń DBTI ABW w ASP.NET Zbigniew Łapiński
    10:15 - 10:35 Przerwa kawowa
    10:35 - 11:50 Integrating Windows Presentation Foundation and Windows Communication Foundation into Your Office Business
    Applications Tim Huckaby 11:50 - 12:50 Lunch
    12:50 - 14:05 Build great software with Rosario tools Michael Juřek
    14:05 - 14:25 Przerwa kawowa
    14:25 - 15:40 Testy w Microsoft Visual Studio Team System 2008 Artur Jedynak
    15:40 - 16:00 Sesja generalna (zamykająca)

    Niestety sesja Bartka Pampucha koliduje z równie ciekawą sesją Szymona Kobalczyka o aplikacjach biznesowych w WPF :( mam nadzieję, że będzie można zobaczyć materiały wideo,  a ja oprócz tego wysyłam na nią swoich szpiegów ;)

    Co mi przypomina, że nadal nie zarezerwowałem hotelu :(
    opublikowano 19 sierpnia 2008 20:38 przez bszafko | 2 komentarzy
    Filed under:
  • Instalator w pliku msi część 1

    Zapomniane instalki

    Bardzo ważnym aspektem, każdej tworzonej aplikacji desktopowej jest instalacja. Ta część często bywa zaniedbywana przez twórców oprogramowania, a jej rola jest nie do przecenienia. Potencjalny klient szybko się zniechęca gdy nie może uruchomić, a co dopiero zainstalować aplikację. Tymczasem developerzy myślą raczej w kategoriach tworzenia aplikacji a zapewnienie prostej i powtarzalnej instalacji w ogóle nie jest umieszczane na liście funkcjonalności.

    Narzędzia

    Istnieje całkiem spora liczba narzędzi pozwalających zająć się tym problemem, spora część z nich jest komercyjna i raczej nadaje się do projektów ze sporymi budżetami. Pierwsze co przychodzi na myśl to Installshield - jest to naprawdę profesjonalne narzędzie mające wielu zwolenników, nie ma co się dziwić jest już na rynku sporo czasu.

    Windows Installer XML

    2 lata temu, gdy szukałem sensownej (również pod względem finansowym) metody zbudowania setupu dla małej aplikacji udało mi się znaleźć WiX (Windows Installer Xml). Wtedy było naprawdę trudno go znaleźć - zajęło mi to naprawdę sporo. Dla mojego projektu instalator tworzony przez visual studio 2005 w ogóle nie zdawał egzaminu. Po pierwsze instalacja była dostępna tylko po angielsku, a po drugie nie można było definiować bardziej zaawansowanych operacji ( można była wykorzystać custom action w .net, ale nie działały za dobrze).

    Mało kto wie, że WiX jest pierwszym projektem open source wydanym prze Microsoft, dzięki sporemu zaangażowaniu Roba Menschinga. Narzędzie okazało się na tyle użyteczne, że również zespoły z wewnątrz MS zaczęły go używać.

    WiX pozwala na podstawie stosunkowo prostych plików XML stworzyć pliki .msi, czyli popularne instalatory Windowsowe. WiX obsługuje praktycznie wszystko co można znaleźć w specyfikacji MSI, uwzględnia wszystkie nowinki związane z Vistą i wersją 4.0 Windows Installera. To co dla mnie okazało się szczególnie fajne to integracja z Visual Studio za pomocą wtyczki Votive.

    WiX - wersje

    W tej chwili dostępne są 2 wersje Wixa 2.0 i 3.0. Pierwsza jest uważana za stabilną, ale osobiście polecam używanie 3.0, która zawiera najnowsze funkcjonalności. Co prawda czasem zdarzają się z nią małe problemy, ale z reguły upgrade załatwia sprawę.

    Pliki .msi

    Sam plik .msi jest bazą danych, w środku zawarte są są tabele, które z kolei mają kolumny i wiersze. Można nawet na nich wykonywać proste zapytania. Istnieje fajne narzędzie - Orca, które pozwala na podglądanie i edycję zawartości plików - w sam raz dla prawdziwych eksperymentatorów. Linki:
    • Windows Installer Xml - strona główna projektu
    • WixWiki - niezłe źródło informacji
    • dzięki temu feedowi zawsze będziesz na bieżąco z Wix
    • a stąd możesz ściągnąć najaktualniejsze wersje
    • podcast - wywiad z Robem, w którym opowiada o początkach WiX
    • Orca - oficjalnie dostępna jako część windows sdk, ale w sieci można znaleźć też "luźnego" exeka
    W następnym poście pokaże jak w prosty sposób zrobić instalatora w MSI.

    Bartek Szafko
  • ASP .NET MVC Preview 4 już w tym tygodniu

    Na blogu Scotta Guthrie ukazała się notatka, że już w tym tygodniu można spodziewać się następnej wersji preview ASP .NET MVC. Post zawiera również pierwszą część opisu zmian, które raczej nie dotyczą przysłowiowych bebechów, tylko nowych funkcjonalności. Muszę przyznać, że czytając posta miałem lekkie deja-vu.

    To o czym pisze Scott to:
    • Atrybut HandleError - obsługa błędów opdowiednik Rescue z MvcContrib
    • Atrybut OutputCaheFilter - cachowanie wyników akcji, podobne propozycje można było znaleźć na wielu blogach
    • Atrybut Authorize - zabezpiecznie wywołania akcji tylko dla określonych, zalogowanych lub posiadających określoną rolę użytkowników. Zamiast tego z powodzeniem można użyć standardowego .netowego PrincipalPermissionAttribute
    • AccountController - czyli domyślny kontroler generowany z szablonem aplikacji realizujący logowanie, rejestrację i przypominanie hasła. Taką funkcję do tej pory pełnił MvcMembership , szkoda tylko że nie ma wsparcia dla Cardspace, ale widać że pewnie inna grupa się tym zajmuje
    • TempData - będzie można testować bez mockowania


    Jak widać zespół postarał się, żeby dodać wszystko czego brakowało w pudełku z MVC.

    Scott ma w następnym poście napisać o możliwościach użycia AJAXa, ciekaw jestem jak to im wyszło.

    Bartek Szafko
    opublikowano 14 lipca 2008 18:53 przez bszafko | 20 komentarzy
    Filed under:
  • ALT .NET - alternatywne podejście do programowania

    ALT .NET jest ruchem wśród developerów, którego manifest brzmi następująco:

    Jesteśmy samoorganizującą się społecznością developerów. Łączy nas chęć ciągłego ulepszania siebie, rzucamy wyzwania dotychczasowym schematom i pomagamy sobie wzajemnie osiągnąć doskonałość w tworzeniu oprogramowania.

    za http://altdotnet.org

    Ruch ALT .NET jest na tyle nowy, że nawet nie ma jeszcze ścisłej definicji. Jako pierwszy terminem posłużył się Dave Laribee w kwietniu zeszłego roku i wskazał 4 główne cechy, które powinna wykazywać osoba, żeby określić ją tym terminem:
    1. Jesteś typem developera, który używa najlepiej działających narzędzi w danej chwili, ale cały czas masz otwarte oczy na lepsze metody
    2. Sięgasz poza główny nurt i adaptujesz to co jest najlepsze z każdej społeczności: Open Source, Agile, Java, Ruby i inne
    3. Nie jesteś zadowolony ze statusem quo. Twój kod zawsze może być lepiej zapisany, bardziej elegancki, prosty o wyższej jakości
    4. Wiesz, że narzędzia, są bardzo przydatne, ale nie załatwiają wszystkiego. To zasady i wiedza są naprawde ważne. Najlepsze są narzędzia, które wykorzystują wiedzę i zachęcają do stosowania zasad

    W ALT .NET chodzi bardziej o zasady niż narzędzia, ale jest parę, o których wszyscy członkowie ruchu piszą: NUnit, xUnit, CC.NET, NHibernate, PostSharp i wiele innych.
    Moim zdaniem ruch może uzyskać spore poparcie, ponieważ wspiera różnorodność, pomysłowość i innowację.
    Ja jestem ALT .NET!
    Poniżej kilka źródeł związanych z tematem:
    • Dave Laribee - oryginalny post na blogu o ALT .NET
    • ALT .NET Podcast - na razie głównie o narzędziach i wzorcach projektowych
    • ALT .NET - strona zbierająca informacje o ruchu
    • Jeffrey Palermo - jego własne rozwinięcie ALT .NET
    • Scott Hanselman - z opisem, fajnym logiem(który użyłem w tym poście) i geekcodem, ten człowiek zawsze pisze ciekawe rzeczy :)


    Artykuł ukazał się także na blogu http://bartekszafko.pl
    opublikowano 9 lipca 2008 22:30 przez bszafko | 5 komentarzy
    Filed under:
  • Garść linków o ASP .NET MVC

    Pogoda specjalnie nie sprzyja pisaniu postów, dlatego tym razem trochę ciekawych moim zdaniem linków o asp .net mvc.
    • Kigg - klon digga całkowicie w MVC
    • MvcMembership - starter kit zajmujący się wszystkimi sprawami związanymi z autoryzacją i logowaniem wspiera: OpenId i WindowsLive (na razie nie ma OAuth)
    • HydrogenCMS - bardzo prosty CMS, umożliwiający edycję stron za pomocą Windows Live Writer, pomysłowe
    • MVCContrib, o którym już pisałem wcześniej, społecznościowa biblioteka ze sporą funkcjonalnością ( min. IoC)

    Trochę podcastów do posłuchania na plaży w weekend :) :


    A teraz czas na relaks!

    Artykuł ukazał się także na blogu http://bartekszafko.pl
    opublikowano 4 lipca 2008 21:07 przez bszafko | 3 komentarzy
    Filed under:
  • Co się dzieje w poznańskiej grupie .NET ?


    Jak tylko spotkam któregoś z uczestników spotkań poznańskiej grupy .NET odrazu pada pytanie o to kiedy następne spotkanie.

    W tej chwili postanowiliśmy zrobić wakacyjną przerwę, którą chcemy wykorzystać do zaplanowania i zorganizowania całego przyszłego "sezonu" wrzesień 08 - czerwiec 09.

    Na pewno spotkania będą się odbywały bardziej regularnie niż do tej pory, chcemy też wypróbować nowe lokalizację.

    Chcemy też zaangażować więcej osób w działania grupy.W tej chwili olbrzymim wspraciem są Michał Korsak, Dominik Domin, Marcin Samelak.

    Mam też cichą nadzieję, na współpracę ze stowarzyszeniem GIK, który ma olbrzymie doświadczenie w organizacji konferencji i eventów. Z Kasią Bylec z GIKa miałem przyjemność rozmawiać podczas ostatniego democampa, który naprawdę zgromadził sporą publikę - GRATULACJE!

    Jeśli masz jakieś uwagi/pomysły zachęcam do wpisywania się do komentarzy, na pewno każdy głos zostanie wysłuchany.
    opublikowano 27 czerwca 2008 19:16 przez bszafko | 0 komentarzy
    Filed under: , ,
  • Wszystko idzie do Linq

    Linq - language integrated query, to w dużym uproszczeniu możliwość definiowania zapytań podobnych do SQLa dla różnych źródeł danych. Domyślnie Linq wspiera XML (XLinq) oraz bazy danych (LinqToSql).

    Ostatnio powstaje bardzo dużo rozszerzeń do Linq. Jedno z nich zwróciło moją szczególną uwagę: JsonToLinq. Javascript Object Notation jest formatem, w którym można zserializować obiekty JavaScriptowe i później je szybko zdeserializować. Czytałem (niestety w tej chwili nie pamiętam źródła), że JSON jest wielokrotnie szybszy niż parsowanie XML przy AJAXowych wywołaniach.

    Przykładowo JSON może wyglądać tak: { 'id': 2,
    'login': 'wiesiek',
    'background_path': '/users/sztywny/background',
    'avatar_path': '/users/sztywny/avatar',
    'current_status_path': '/statuses/12345'
    }

    Więcej o JSONIE.

    Biblioteka JSON.NET implementuje odpowiednie ( i co najważniejsze szybkie)readery dla jsona, przez co można skorzystać z wszystkich możliwości jakie daje Linq. Dla powyższego przykładu JSONa, odczytujący go kod może wyglądać tak:

        1 user.Id = jsonResponse.PropertyValue<int>("id");

        2 user.Name = jsonResponse.PropertyValue<string>("login");

        3 user.ScreenName = jsonResponse.PropertyValue<string>("login");



    Jednak prawdziwe możliwości ujawnia przy przetwarzaniu bardziej złożonych struktur:

    [{ "type":"DirectedMessage",
    "body":"aaaa",
    "transport":{"name":"www","id":6},
    "id":2424062,
    "user_path":"/users/xxx",
    "recipient_path":"/users/yyyy",
    "created_at":"2008-06-25 20:02:32"
    },{ "type":"Status",
    "body":"zzzzzzz",
    "transport":{"name":"api","id":7},
    "id":2424061,
    "user_path":"/users/rrrr",
    "created_at":"2008-06-25 20:02:10"
    }]


    Żeby z takiej reprezentacji stworzyć strukturę obiektów można zrobić coś takiego:

        1 JArray jsonResponse = JArray.Load(new JsonReader(reader));

        2 if (jsonResponse != null)

        3 {

        4     var _tweets = from o in jsonResponse.Children<JObject>()

        5             select new Tweet()

        6                         {

        7                             DateCreated = o.PropertyValue<DateTime>("created_at"),

        8                             Id = o.PropertyValue<long>("id"),

        9                             Text =  o.PropertyValue<string>("body"),

       10                             User = GetUser(ApiUrl + o.PropertyValue<string>("user_path"))

       11                         };

       12  }



    A piszę o tym dlatego, że zacząłem bawić się API do BLIPa, które wszystkie wyniki zwraca właśnie w formacie JSON.

    To co próbuje zrobić to dostosować fajnego klienta Twitter(protoplasty blipa) w wpf do współpracy z naszym rodzimym serwisem. Udało mi się już zalogować do serwisu i pobrać ostatnie wiadomości, jednak jak na razie przy większej liczbie żądań pojawia się błąd :( wydaje mi się, że jest to bolączka tego rozwiązań.



    Oryginalny klient Twittera nazywa się Witty i ma całkiem ciekawy kod :)

    Tekst ukazał się również na blogu Bartka Szafko.
    opublikowano 26 czerwca 2008 18:48 przez bszafko | 0 komentarzy
    Filed under: , , , , ,
  • 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
  • Eye candy + MOSS = Hed Kandi

    Hed Kandi to label wytwórnii muzycznej. Użyli Sharepoint Server do zbudowania swojej strony i zintegrowali go z Silverlight. Jak przystało na label muzyczny taka strona musi być z jajem :) i myśle, że to się udało - całość robi wrażenie świetne wrażenie:


    Polskie grupy są właśnie w trakcie przenosin na nowy portal nazywany roboczo ex it-core. Zbudowany jest także na Sharepoincie. Fajnie by było gdyby tak wyglądały strony grup :) A wiem, że są w Polsce super specjaliści od Silverlight!

    Jest dostępna sesja z Mix'08 o tym jak stworzono to cudeńko: http://sessions.visitmix.com/?selectedSearch=BCT06

    Artykuł ukazał się także na blogu Bartka Szafko
  • Chroń swoje akcje w MVC

    Bynajmniej nie będzie w tym poście o rynkach kapitałowych ;)

    Jeden z czytelników niedawno zapytał mnie w jaki sposób chronić akcję przed niepowołanym dostępem.Okazauje się, że ASP .NET MVC z pomocą standardowych komponentów .NET stosunkowo to zrealizować.

    Wyobraźmy sobie, że mamy akcję, którą chcielibyśmy chronić, tak żeby tylko użytkownik o nazwie Administrator mógł ją wywołać:


        1 public ActionResult About()

        2 {

        3     ViewData["Title"] = "About Page";

        4 

        5     return View();

        6 }

    (używam już składni z preview 3)

    W standardowym .NET istnieje atrybut pozwalający ograniczać dostęp do metod nazywa się PrincipalPermission ( dużo o nim można przeczytać na msdnie). Pozwala on określić, czy żeby uzyskać dostęp, wystarczy być tylko zalogowanym, czy trzeba należeć do określonej roli, czy może mieć konkretną nazwę użytkownika. W wypadku, gdy ktoś niepowołany uzyska dostęp do metody zrzucony zostanie wyjątek SecurityException.

    Jednak, takie zachowanie(rzucanie wyjątkami) nie jest porządanym zachowaniem dla naszej aplikacji w MVC, trzeba by przekierować użytkownika na przykład na stronę logowania. W MVC istnieje pojęcie filtrów( dziedziczących po ActionFilterAttribute), które pozwalają przechwytywać wykonywanie akcji i realizować określone zadania, przykładowy filtr mógłby wyglądać tak(tylko najważniejszy kod, reszta do ściągnięcia):


        1 public override void OnActionExecuted(ActionExecutedContext filterContext)

        2  {

        3     Exception exception = filterContext.Exception;

        4 

        5     if (exception == null)

        6         return;

        7 

        8     foreach (Type exceptionType in ExceptionTypes)

        9     {

       10         if (exceptionType.IsAssignableFrom((exception.InnerException ?? exception).GetType()))

       11         {

       12             filterContext.ExceptionHandled = true;

       13 

       14             if (Redirect)

       15             {

       16                 RouteValueDictionary routes = new RouteValueDictionary();

       17                 routes.Add("Action", Action);

       18                 routes.Add("Controller", Controller);                     

       19                 filterContext.Result = new RedirectToRouteResult(routes);

       20             }

       21             else

       22             {

       23                 filterContext.HttpContext.Response.Clear();

       24 

       25                 filterContext.HttpContext.Response.StatusCode = ResponseCode;

       26                 filterContext.HttpContext.Response.StatusDescription = ResponseDescription;

       27 

       28                 filterContext.HttpContext.Response.ContentType = "text/html";

       29                 filterContext.HttpContext.Response.Write("<html><head><title>" + ResponseDescription + "</title></head><body>");

       30                 filterContext.HttpContext.Response.Write("<h2>" + ResponseDescription + "</h2>");

       31                 filterContext.HttpContext.Response.Write("<p>" + (exception.InnerException ?? exception).Message + "</p>");

       32                 filterContext.HttpContext.Response.Write("</body></html>");

       33                 filterContext.HttpContext.Response.Flush();

       34 

       35                 filterContext.HttpContext.ApplicationInstance.CompleteRequest();

       36             }

       37         }

       38     }

       39  }


    ( przykład zapożyczony z biblioteki ManagedFusion - spodobało mi się to podejście)

    Teraz wystarczy przerobić naszą akcję, aby wyglądała tak:


        1 [PrincipalPermission(SecurityAction.Demand, Name = "Administrator")]

        2 [ExceptionHandler("Login", "Uzytkownik", typeof(SecurityException))]

        3 public ActionResult About()

        4 {

        5     ViewData["Title"] = "About Page";

        6 

        7     return View();

        8 }


    Spowoduje to, przekierowanie użytkownika do akcji Login w kontrolerze Uzytkownik. Oczywiście należy zatroszczyć się, aby do aplikacji można było się zalogować - można w tym celu użyć normalnej autentykacji forms albo dowolnej innej obsługiwanej w asp .net. Standardowe MembershipProvidery i RoleProvidery też dadzą się użyć.

    Do ściągnięcia jest kod przykładowej aplikacji z autoryzacją Forms, nie jest on w żadnym wypadku produkcyjny, a jego napisanie zajęło mi tylko 20 minut.

    Polecam także świetny artykuł Roba Connery na ten temat


    Tekst ukazał się także na blogu Bartek Szafko
  • ASP .NET MVC Preview 3 już jest

    Od 27 maja dostępny jest Preview 3 ASP .NET MVC. O najważniejszej zmianie, czyli o nowym sposobie obsługi renderowania widoków wspominałem już wcześniej. Dzisiaj trochę więcej szczegółów i przykładów.

    Wszystkie akcje muszą teraz zwracać ActionResult:

    public ActionResult Index()

    {

        ViewData["Title"] = "Home Page";

        ViewData["Message"] = "Welcome to ASP.NET MVC!";

        return View();

    }


    ActionResult jest klasą abstrakcyjną, z której dziedziczy:
    • ViewResult - zwracany obiekt przekazuje informacje o tym, że ma być wygenerowany widok, odpowiednik RenderView. Co ciekawe nie trzeba przekazywać nazwy widokum,która domyślnie jest taka sama jak nazwa akcji. Obiekt ActionResult najlepiej tworzyć używając metody View, która opcjonalnie pozwala podać nazwę widoku, masterpage oraz dane. Metoda View używa także słownika ViewData, który znajduje się w kontrolerze do pobrania danych dla widoku.
    • JsonResult - zwraca zserializowany do javascript obiekt. Bardzo interesująca sprawa pozwala na zwracanie wyników w formacie strawialnym od ręki dla JS.
    • RedirectToRouteResult - pozwala na przekierowanie do innej akcji lub nazwanej sciezki z tabeli routingu. W RedirectToAction nazwa akcji i controllera jest stringiem, takie rozwiązanie ma wady - podczas komiplacji nie dostaje się informacji o nieprawidłowych wywołaniach. Wydaje mi się, że korzystniejsze byłoby użycie LINQ coś w stylu:

      return RedirectToAction<HomeController>(c => c.Index());

    Dzięki takim zmianom testowanie akcji jest możliwe bez mockowania całego contextu http:

    [TestMethod]

    public void Index()

    {

        // Setup

        HomeController controller = new HomeController();

     

        // Execute

        ViewResult result = controller.Index() as ViewResult;

     

        // Verify

        ViewDataDictionary viewData = result.ViewData as ViewDataDictionary;

        Assert.AreEqual("Home Page", viewData["Title"]);

        Assert.AreEqual("Welcome to ASP.NET MVC!", viewData["Message"]);

    }


    Inne:
    • zmiany w helperach HTML
    • zmiany w routingu - możliwość tworzenia bardziej skomplikowanych i sparametryzowanych ścieżek
    Jak zwykle przy okazji MVC polecam wpis na blogu Scotta jest tam dużo informacji także o pozostałych zmianach.

    Preview 3 można ściągnąć w źródłach i binariach.

    Tekst ukazał się także na blogu Bartek Szafko
    opublikowano 8 czerwca 2008 22:37 przez bszafko | 4 komentarzy
    Filed under:
  • Inauguracja

    Podobnie jak EURO 2008 dzisiaj, dzięki uprzejmości Michała, inauguruje pisanie na zine.net.pl.

    O czym na pewno będę tutaj pisał:
    • ASP .NET MVC - wzorzec MVC dla ASP .NET, aktualnie mój konik jeśli chodzi o tworzenie aplikacji webowych w .NET
    • WiX - Windows Installer XML, czyli tworzenie setupów w plikach .msi, jest to sprawa, którą się interesuje od dłuższego czasu, trochę o tym wiem i chętnie się podzielę
    • wszystko co związane z .NET - ostatnio dużo nowości w .NETowym światku co mam nadzieje również zaowocuje ciekawymi tekstami
    • a o czym Ty byś chciał usłyszeć - napisz komentarz!
    Oprócz pisania na zinie prowadzę jeszcze prywatnego bloga: bartekszafko.pl nie zamierzam go porzucać, a artykuły będą pojawiały się równolegle tu i tam.

    Działam także w poznańskiej grupie .NET - zachęcam wszystkich do udziału w spotkaniach.

    Bartek Szafko
    opublikowano 7 czerwca 2008 11:17 przez bszafko | 8 komentarzy
    Filed under:
Więcej wypowiedzi « Poprzednia strona
W oparciu o Community Server (Personal Edition), Telligent Systems