ASP.NET MVC 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 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 Web Pages Przykład (1/2) @{ 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> Test.cshtml
ASP.NET Web Pages Przykład (2/2)
ASP.NET MVC Framework firmy Microsoft dla ASP.NET oparty o wzorzec Model-View-Controller (MVC) inspirowany frameworkiem Ruby on Rails pierwsza wersja produkcyjna: marzec 2009 przedstawiany jako alternatywa dla Web Forms, a nie następca aktualna wersja MVC6 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
Zalety ASP.NET MVC Pełna kontrola nad generowanym kodem HTML Embrace HTTP and HTML - don't hide it brak view state i formularzy po stronie serwera Możliwości integracji z Ajax, jquery 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
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
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
Kreator aplikacji w ASP.NET (VS 2013) Zunifikowany kreator obejmujący różne frameworki w ramach ASP.NET
Uwierzytelnianie użytkowników w ASP.NET No Authentication Individual User Accounts Rejestracja przez aplikację, profile w SQL Server Organizational Accounts Active Directory / Office 365 Windows Authentication Dla aplikacji intranetowych
Struktura projektu ASP.NET MVC Nowo utworzony projekt zawiera zaczątek aplikacji, który można następnie dostosować i rozwinąć kontrolery i widoki dla strony powitalnej szablon strony (layout page) domyślna reguła routingu obsługa logowania użytkowników opcjonalnie towarzyszący projekt do testów jednostkowych
Aplikacja startowa ASP.NET MVC
Routing Global.asax.cs public class MvcApplication : System.Web.HttpApplication { protected void Application_Start() { RouteConfig.RegisterRoutes(RouteTable.Routes); } } public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.maproute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); } } RouteConfig.cs
Controller public class HomeController : Controller { public ActionResult Index() { return View(); } HomeController.cs public ActionResult About() { ViewBag.Message = "Your application description page."; } } return View();
View @{ ViewBag.Title = "About"; } <h2>@viewbag.title.</h2> <h3>@viewbag.message</h3> About.cshtml <p>use this area to provide additional information.</p>
Szablon stron (layout) <html><head> <title>@viewbag.title - My ASP.NET Application</title> @Styles.Render("~/Content/css") @Scripts.Render("~/bundles/modernizr") </head> <body> <ul class="nav navbar-nav"> <li>@html.actionlink("home", "Index", "Home")</li> <li>@html.actionlink("about", "About", "Home")</li> <li>@html.actionlink("contact", "Contact", "Home")</li> </ul> <div class="container body-content"> @RenderBody() </div> </body></html> _Layout.cshtml
Współdzielenie kodu wykonywalnego widoków Pliki _ViewStart W folderze Views W podfolderach widoków poszczególnych kontrolerów Uruchamiane na początku renderowania widoku @{ Layout = "~/Views/Shared/_Layout.cshtml"; } _ViewStart.cshtml
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 MVC View Model Patterns Domain model jako view model Np. encja Entity Framework Dedykowany view model zawierający obiekt (lub obiekty) domain model (+ dane potrzebne do prezentacji) Dedykowany view model zawierający atrybuty obiektu dziedziny (+ dane potrzebne do prezentacji) Konieczna translacja między obiektami dziedziny i widoku
Domain object Przykład (EF) namespace MVCNews2013.Models { public class NewsItem { [Key] public int Id { get; set; } public DateTime TimeStamp { get; set; } public string Text { get; set; } } } public class NewsDBContext : DbContext { public DbSet<NewsItem> News { get; set; } }
Scaffolding w ASP.NET MVC Technika generowania funkcjonalności CRUD dla obiektu dziedzinowego (kontroler + widoki) Kreatory Visual Studio dla ASP.NET MVC: Kompletny scaffolding od encji EF do kontrolera z akcjami CRUD i odpowiadającymi im widokami Utworzenie kontrolera z akcjami CRUD dla encji EF (bez widoków) Tworzenie widoku dla danej akcji kontrolera z możliwością wskazania encji EF jako modelu
Kompletny scaffolding w ASP.NET MVC (1/2)
Kompletny scaffolding w ASP.NET MVC (2/2)
Selektywne tworzenie silnie typowanych widoków dla akcji kontrolera
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
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: <% %> REST-owe URI helpery ułatwiające kodowanie Pierwotnie pozycjonowany jako alternatywa dla Web Forms; w praktyce je w nowych projektach zastąpił