ASP.NET MVC dba o to, aby niemożliwe było dokonanie ataku CSRF. Nie musimy sami generować tokenów i wszystko zostanie obsłużone przez framework. Niestety czasami taka obsługa nie jest zbyt user-friendly. Ostatnio spotkałem następujący scenariusz:Otworzyłem stronę do logowania w dwóch osobnych tabach. Sesja jest więc współdzielona.W pierwszej z nich, kliknąłem loguj. Token w tym momencie na serwerze jest unieważniany.W drugim tabie token wygenerowany i przechowany w ukrytym polu, nie pokrywa się już z ty...
Jednym ze sposobów na przyspieszenie wczytywania strony internetowej jest asynchroniczne ładowanie skryptów JavaScript. Jest to ważne szczególnie kiedy wykorzystujemy na naszych stronach skrypty znajdujące się na zdalnych serwerach, ponieważ często ich pobieranie trwa długo. Przeglądarki internetowe, domyślnie podczas wczytywania strony przetwarzają poszczególne elementy DOM jeden po drugim czyli synchronicznie. Jako, że script również jest takim elementem, jego przedłużone wczytywanie mo...
W najnowszej wersji 5, mamy do dyspozycji nowy rodzaj filtrów, implementujący interfejs IOverrideFilter:publicinterface IOverrideFilter { ///////// Type FiltersToOverride { get; } } Atrybuty przydają się, gdy mamy jeden filtr nałożony globalnie i potem chcemy zmienić zachowanie wyłącznie dla specyficznej akcji. Na przykład, możemy nałożyć Authorize globalnie i potem dla konkretnej akcji zmienić reguły autoryzacji. Innymi słowy, IOverrideFilter umożliwia wyczyszczenie wszystkich filtrów dla konk...
Ostatnio jeden z czytelników tego bloga zadał mi pytanie związane z oknami modalnymi w Bootstrap co skłoniło mnie do poszperania trochę w dokumentacji wtyczek jQuery do Bootstrap’a. Po bliższym zapoznaniu się z tą tematyką uznałem, że może z tego powstać całkiem ciekawy i użyteczny wpis – i oto efekt Zresztą nie ma co przedłużać, przejdźmy zatem do rzeczy!
Hej! Dziś trochę o moim ulubionym języku JavaScript, a konkretniej o dość popularnej konstrukcji tego języka jakim są wywołania zwrotne czyli inaczej, z angielska, o funkcjach callback. Jak możecie przeczytać w tytule tego wpisu, jest on poświęcony pewnemu szczególnemu przypadkowi funkcji callback – chodzi mianowicie o wywołanie zwrotne, które jednocześnie jest metodą obiektu. Zanim jednak przejdę do omówienia tego konkretnego przypadku, kilka słów przypomnienia co to jest funkcja callbac...
Zwykle widoki nie są kompilowane aż do momentu publikacji i pierwszego zapytania. Czasami jednak warto, aby były one kompilowane w czasie pracy z kodem. Bardzo łatwo popełnić literówkę, która nie będzie wykryta aż do momentu, gdy użytkownik będzie chciał wejść na tą stronę. Przy wielu widokach jest to dość niewygodne i może okazać się bardzo uciążliwe.
Jak pewnie wielu z Was pamięta, w jednym z ostatnich wpisów poruszyłem temat LESS czyli swego rodzaju rozszerzenia CSS, pozwalającego na re-używanie kodu, definiowanie zmiennych itp., itd. Wpis tamten zdecydowanie był jedynie wstępem do bardziej szczegółowego opisu możliwości tego rozwiązania – napisałem w końcu tylko jak zacząć używać LESS oraz pokazałem jeden prosty przykład kodu… Dziś zatem pora na znaczne poszerzenie tego tematu i więcej szczegółów dotyczących LESS… postaram się przyb...
W poprzednim poście pisałem o podstawach Web API. Dzisiaj zajmiemy się obsługą błędów. Sprawdźmy najpierw, co stanie się, gdy nasz kontroler (patrz poprzedni wpis), zwróci jakiś wyjątek np.:public Person GetPersonById(int id) { if(id
Hej, witam po tygodniu przerwy! Powód, dla którego mnie nie było możecie już oglądać już od wczoraj… Chodzi oczywiście o nowy wygląd bloga – po przejściu na WordPress, żaden z darmowych tematów niezbyt mi się nie podobał, dlatego postanowiłem, że zamiast kupować jakiś płatny, zrobię swój własny, a przy okazji się czegoś nowego nauczę… Tak, że oto są rezultaty ostatnich paru dni mojej pracy! Jak się Wam podoba? Jednym z efektów ubocznych mojej ostatniej pracy nad tematem interfejsu użyt...
W dzisiejszym poście będzie o tzw. Web API. Usługi REST są dzisiaj już wszechobecne ze względu na liczbę dostępnych platform oraz co za tym idzie, skalowalność. Web Api ułatwia pisanie serwisów REST. Nic nie stoi na przeszkodzie, abyśmy używali starego podejścia czyli implementacji akcji w klasycznych kontrolerach. Web Api jednak ułatwia pracę z REST oraz jest tak naprawdę rozszerzeniem MVC. Jeśli ktoś zna ASP.NET MVC, nie będzie miał żadnego problemu z Web Api. Cała infrastruktura jest analogiczna do k...
Walidacja danych to bardzo szeroki temat. Sprawdzamy poprawność danych zarówno po stronie klienta (JavaScript) jak i serwera. Występuje ona we wszystkich warstwach systemu. Dzisiaj napiszemy metodę po stronie serwera, która będzie weryfikowała dane. W przeciwieństwie jednak do klasycznego podejścia, nie będziemy przeładowywać całej strony od nowa. Wywołanie będzie Ajaxowe czyli w tle (asynchroniczne). Użytkownik wpisując jakieś dane do formularza, spowoduje tym samym wysyłanie w tle żądania do serwera, k...
The problem I would like to discuss is an API call, where you need to send binary data (for example multiple images) and some metadata information together. There are various ways you can approach this, and I will describe them briefly. Then I will go into more detail on multipart/form-data requests and how they can help you with the mentioned task.Approach 1 – Send metadata and files in separate requests The steps could be this:Send metadata to server Server stores metadata and generates an unique URL...
W ASP.NET MVC do dyspozycji jest dość mało popularny atrybut Bind, który pozwala określić zachowanie bindingu pomiędzy modelem a widokiem. Załóżmy, że mamy następujący model:publicclass Person { publicstring FirstName { get; set; } publicstring LastName { get; set; } publicstring Email { get; set; } } Następnie napiszemy prostą akcję, zwracającą model do widoku:public ActionResult Create() { var person=new Person(); return View(person); } Widok stanowić będzie prosty formularz:@using ...
W poprzednim wpisie zająłem się wpływem sesji na wydajność kontrolerów. Dzisiaj zajmiemy się asynchroniczny kontrolerami, które znaczącą zostały uproszczone w .NET 4.5. Żeby zrozumieć jak działają asynchroniczne kontrolery, należy zdawać sobie sprawę, jak działa przetwarzanie zapytań. Załóżmy, że wysłanych jest 1000 zapytać do serwera. Czy zostaną one obsłużone jednocześnie, a może sekwencyjnie, jedno po jednym? ASP.NET MVC ma pulę wątków, przeznaczoną do przetwarzania zapytań. Jeśli zatem pula ma poje...
W ostatnim wpisie wyjaśniłem jak bardzo sesja wpływa na wydajność i skalowalność aplikacji. Dzisiaj chciałbym pokazać przykład i konkretne liczby, które pozwolą nam oszacować skalę problemu. Zacznijmy od ASP.NET MVC. Stworzymy trzy kontrolery:SessionlessCotroller – kontroler będzie miał zablokowaną sesję. SessionController – kontroler zapisuje dane do sesji. SessionReadOnlyController – kontroler ma dostęp tylko do odczytu. Kod:[SessionState(SessionStateBehavior.Required)] publicclass SessionController...
Synchronizacja i przechowywanie sesji może być bardzo niekorzystne dla wydajności aplikacji webowej. Wyobraźmy sobie, że użytkownik wywołuje kontroler kilkukrotnie w ramach tej samej sesji. ASP.NET MVC musi zadbać o to, aby sesja zawsze miała prawidłową wartość. Niestety jest to osiągane poprzez kolejkowanie zapytaniach w ramach tej samej sesji. Jeśli zatem wywołujemy dwukrotnie metodę A, nie zostanie to wykonane współbieżnie. Dobrą stroną takiego mechanizmu jest fakt, że zapis i odczyt sesji jest bezpie...
Ostatnimi czasy dwa razy w swoich postach poruszałem temat narzędzia Bootstrap. Wspomniałem tam między innymi, że możliwe jest skonfigurowanie własnych zmiennych LESS, które możemy później używać we własnych tematach... Stwierdziłem więc, że skoro jestem już przy narzędziach takich jak Bootstrap, to warto również poruszyć ten temat i zrobić małe wprowadzenie do LESS. Jako, że temat jest dość obszerny, postanowiłem że napiszę dwa wpisy na ten temat i w kolejnym postaram się dokładniej przybliżyć możliwośc...
Domyślnie ASP.NET MVC blokuje metody zwracające JSON, które wywołuje się za pomocą HTTP GET. Przykład:public ActionResult GetData() { return Json(new []{new Person("Piotr","Zielinski")}); } Wykonanie zakończy się wyjątkiem: This request has been blocked because sensitive information could be disclosed to third party web sites when this is used in a GET request. To allow GET requests, set JsonRequestBehavior to AllowGet. Z tego względu, programiści często wywołują Json z parametrem AllowGet:publi...
Kiedyś już o tym pisałem pobieżnie (kilka lat temu), ale dzisiaj chciałbym pokazać inny przykład wraz ze wszystkimi możliwymi parametrami. Stwórzmy najpierw klasyczny formularz i kontroler: @using (Html.BeginForm()) { @Html.DropDownList("selectedGroup",new SelectList(new []{"All","GroupA","GroupB"})) <input type="submit" value="Refresh"> } Prosty formularz z ComboBox i przyciskiem, który powoduje ponowne załadowanie strony oraz wykonanie metody GetData z nowym parametrem:public ActionResul...
W poprzednim wpisie pokazałem Wam zalety narzędzia MvcSiteMapProvider. Zapowiedziałem też, że to nie koniec wpisów na ten temat… Jako, że nie rzucam słów na wiatr, dziś obiecana kontynuacja. A konkretnie, tak jak można wyczytać w tytule, zajmę się przedstawieniem jak za pomocą narzędzia MvcSiteMapProvider można trochę „zkustomizować” generowaną automatycznie listę służącą jako menu nawigacyjne. Naszym celem będzie, aby nadać tej liście odpowiednie klasy Bootstrap, tak aby wyglądało to jak należy. Zobaczy...