Architektura MVC w ASP.NET Autor wykładu: Marek Wojciechowski
Modele programistyczne ASP.NET Web Forms Komponentowy interfejs użytkownika (kontrolki) Programowanie wizualno-zdarzeniowe Klasyczna składnia ASP.NET ASP.NET MVC Implementacja wzorca MVC Klasyczna składnia ASP.NET lub silnik Razor Web Pages Proste aplikacje webowe jak w PHP lub starym ASP Składnia Razor Web Forms ASP.NET MVC Web Pages ASP.NET ASP.NET (2)
ASP.NET (3) ASP.NET Web Pages Najnowszy i najprostszy model programistyczny framework do tworzenia dynamicznych stron internetowych w stylu PHP i klasycznego ASP wykorzystuje składnię i silnik Razor (ASP.NET Web Pages 2) open source tworzone w Visual Studio lub darmowym środowisku WebMatrix oparte o silnik widoków (ang. view engine) Razor obsługiwane języki programowania: C# i Visual Basic (rozszerzenia stron.cshtml i.vbhtml)
Silnik widoków Razor ASP.NET MVC od początku wspierał koncepcję silników widoków modułów implementujących różną składnię szablonów stron Spark i NHaml jako przykłady silników szablonów do użycia w ASP.NET MVC zamiast tradycyjnego, znanego z Web Forms, silnika ASP.NET Razor opracowany dla MVC3, stosowany również w MVC4, ale też w ASP.NET Web Pages 2 Cechy silnika Razor przejrzysty kod bazujący na językach C# i VB zwarta i przejrzysta składnia: @{ }, @wyrażenie inteligentny parser umożliwia naturalny przeplot HTML z językiem programowania wspiera IntelliSense, unit tests, layouts helpery do generacji formularzy HTML ASP.NET (4)
ASP.NET Web Pages Przykład (1/2) Test.cshtml @{ var title = Request.QueryString["title"]; if (String.IsNullOrEmpty(title)) { title = "Razor Web Page"; } var count = Request["count"].AsInt(1); } <html> <head><title>@title</title></head> <body> <form method="post"> First name: @Html.TextBox("name", @Request["name"]) # of greetings: @Html.TextBox("count", @count) <input type="submit" value="submit" /> </form> @{ if(ispost) { for(int i = 0; i < count; i++) { <p>hello @Request.Form["name"]!</p> } } } </body></html> ASP.NET (5)
ASP.NET Web Pages Przykład (2/2) ASP.NET (6)
ASP.NET (7) ASP.NET MVC Framework firmy Microsoft dla ASP.NET oparty o wzorzec Model-View-Controller (MVC) pierwsza wersja produkcyjna: marzec 2009 przedstawiany jako alternatywa dla Web Forms, a nie następca aktualna wersja MVC4 open source (licencja MS-PL) darmowy w pełni wspierany od wersji MVC3 oferuje silnik widoków Razor jako alternatywę dla klasycznej składni ASP.NET
ASP.NET (8) Zalety ASP.NET MVC Pełna kontrola nad generowanym kodem HLML Embrace HTTP and HTML - don't hide it brak view state i formularzy po stronie serwera Bogate możliwości integracji z Ajax Intuicyjne adresy URL w aplikacji RESTful i przyjazne wyszukiwarkom Podział kompetencji i odpowiedzialności komponentów aplikacji (ang. separation of concerns) Testowalność wsparcie dla Test-Driven Development (TDD) Nacisk na zarządzanie nawigacją w aplikacji wzorzec Front Controller, routing
ASP.NET (9) Web Forms na tle ASP.NET MVC Abstrakcja od HTML i HTTP view state, postbacks, kontrolki, cykl życia strony ułatwia programistom szybki start trudno porządnie implementować duże systemy mniej kodu RAD, małe zespoły projektowe Orientacja na stronę jako atomową jednostkę aplikacji Website jako domyślny sposób organizacji kodu w VS ścisły związek nazwy pliku strony z adresem URL trudne i mało wydajne testowanie aplikacji wzorzec Page Controller
ASP.NET (10) Role komponentów w ASP.NET MVC Models komponenty odpowiedzialne za pamiętanie stanu stan często utrwalany w bazie danych Views komponenty odpowiedzialne za wyświetlanie interfejsu użytkownika aplikacji widok może być tworzony kreatorem w oparciu o model (CRUD scaffolding) Controllers komponenty odpowiedzialne za obsługę interakcji z użytkownikiem, manipulowanie modelem i wybór widoku do wyświetlenia
ASP.NET (11) Struktura projektu ASP.NET MVC Nowo utworzony projekt zawiera zaczątek aplikacji, który można następnie dostosować i rozwinąć szablon strony (master page) domyślna reguła routingu obsługa logowania użytkowników proste kontrolery i widoki opcjonalnie towarzyszący projekt do testów jednostkowych
Aplikacja startowa ASP.NET MVC ASP.NET (12)
ASP.NET (13) Routing Global.asax.cs public class MvcApplication : System.Web.HttpApplication { public static void RegisterRoutes(RouteCollection routes) {... routes.maproute( "Default", // Route name "{controller}/{action}/{id}", // URL with params new { controller = "Home", action = "Index", id = "" } // Param defaults ); } } protected void Application_Start() { RegisterRoutes(RouteTable.Routes); }
ASP.NET (14) Controller public class HomeController : Controller { public ActionResult Index() { ViewData["Message"] = "Welcome to ASP.NET MVC!"; HomeController.cs } return View(); } public ActionResult About() { return View(); }
ASP.NET (15) View Index.aspx <%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>... <asp:content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server"> <h2><%= Html.Encode(ViewData["Message"]) %></h2> <p> To learn more about ASP.NET MVC visit <a href="http://asp.net/mvc" title="asp.net MVC Website">http://asp.net/mvc</a>. </p> </asp:content>
Master Page <%@ Master Language="C#" Inherits="System.Web.Mvc.ViewMasterPage" %>... <div id="menucontainer"> </div> Site.Master <ul id="menu"> <li><%= Html.ActionLink("Home", "Index", "Home")%></li> <li><%= Html.ActionLink("About", "About", "Home")%></li> </ul> <div id="main"> <asp:contentplaceholder ID="MainContent" runat="server" /> </div>... Obecnie (dla silnika widoków Razor i C#): _Layout.cshtml ASP.NET (16)
ASP.NET (17) Przekazywanie danych z kontrolera do widoku ViewData, ViewBag (od MVC 3) Dane dostępne w ramach pojedynczego żądania nie przetrwają operacji Redirect ViewData["klucz"], ViewBag.klucz TempData Dane przetrwają operację Redirect TempData["klucz"] Wewnętrznie wykorzystuje sesję HTTP View models i strongly typed views Obiekty modelu przekazywane do widoku Rozwiązanie zalecane
ASP.NET (18) Ochrona przed atakami CSRF Cross Site Request Forgery (CSRF, XSRF) atak wykorzystujący zaufanie serwisu do przeglądarki użytkownika (żądanie z przeglądarki zalogowanego użytkownika, podrzucone mu z innego serwisu) Mechanizm obrony w ASP.NET MVC poprzez Anti-Forgery Token generowana losowo informacja dołączona do formularza w polu ukrytym i jednocześnie ustawiana jako cookie po odebraniu formularza wysłanego z przeglądarki test zgodności tokena z pola ukrytego i cookie
ASP.NET (19) AntiForgeryToken w ASP.NET MVC widok z formularzem <% using (Html.BeginForm()) {%> <%= Html.AntiForgeryToken() %> <! elementy formularza <% } %> kontroler przetwarzający dane z formularza [ValidateAntiForgeryToken] public ActionResult Akcja(FormCollection form) {... }
Podsumowanie ASP.NET MVC to nowy framework dla ASP.NET oferowany przez Microsoft implementacja architektury MVC zastosowanie podejść zalecanych w dużych projektach separation of concerns test-driven development Powrót do korzeni: HTML i HTTP niekiedy przypomina ASP: <% %> wsparcie dla REST; helpery ułatwiające kodowanie Ma stanowić alternatywę dla Web Forms każde z rozwiązań ma zalety i wady należy wybrać framework odpowiedni dla realizowanego projektu i kompetencji programistów ASP.NET (20)