Poznaj ASP.NET MVC Kamil Cieślak Microsoft Student Partner 2013-03-11
Agenda Czym jest ASP.NET MVC? Wzorzec MVC ASP.NET MVC vs inne frameworki Bazy danych w ASP.NET MVC Jak zacząć? 2
Czym jest ASP.NET MVC? 3
ASP.NET MVC Framework do pisania aplikacji WWW C# lub Visual Basic po stronie serwera HTML & JavaScript po stronie klienta Wzorzec MVC i routing Wydajne pisanie (Visual Studio + ReSharper) Szybkie dodawanie komponentów za pomocą NuGeta 4
Wzorzec MVC 5
Dlaczego MVC? Oddziela logikę biznesową od warstwy prezentacji Pozwala na łatwe mapowanie adresów URL na elementy aplikacji 6
Komunikacja między warstwami Aplikacja WWW 7
[Authorize] public class EventsController : Controller { private readonly DatabaseEntities db = DatabaseProvider.Context; Kontroler Kontroler } [HttpGet] [AllowAnonymous] public ActionResult Details(int id = 0) { var @event = Event.Get(id); return View(@event); } Akcja 8
public static void RegisterRoutes(RouteCollection routes) { routes.ignoreroute("{resource}.axd/{*pathinfo}"); routes.maproute( name: "Users", url: "Users/{login}", defaults: new { controller = "Users", action = "Show" }, constraints: new { httpmethod = new HttpMethodConstraint("Get") } ); Router App_Data/RouteConfig.cs routes.maproute( name: "Details", url: "{controller}/{id}", defaults: new { controller = "Events", action = "Details", id = UrlParameter.Optional }, constraints: new { httpmethod = new HttpMethodConstraint("Get"), id = @"\d+" } ); } routes.maproute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }, constraints: new { httpmethod = new HttpMethodConstraint("Get"), id = @"\d+" } ); http://eventscentre.apphb.com/events/details/blabla http://eventscentre.apphb.com/users/keraxel http://eventscentre.apphb.com/events/1 http://eventscentre.apphb.com/events/details/1 9
public partial class Event { public int Id { get; set; } public int UserId { get; set; } public string Content { get; set; } public System.DateTime CreatedAt { get; set; } public Nullable<System.DateTime> ModifiedAt { get; set; } public bool Deleted { get; set; } Model } public virtual IEnumerable<EventComment> EventComments { get; set; } public virtual User User { get; set; } public static Event Get(int id) { Event @event = db.events.find(id); if (@event == null) { throw new HttpException(404, "NotFound"); } return @event; } 10
Widok Łączenie kodu HTML z danymi z modelu Łączenie wielu widoków w jeden dokument HTML: Layout Widok standardowy Widok częściowy (partial) Przekazywanie sekcji pomiędzy widokami Razor vs ASPX 11
@model EventsCentre.ViewModels.Shared.CommentDetailsViewModel Model Widok <div class="well clearfix"> <div class="avatar img-polaroid"> <img src="http://s.gravatar.com/avatar/@model.avatar?d=http://media.tumblr.com/tumblr_lak5phfexz1qzqij q.png" width="80" height="80" alt="avatar"/> </div> <div class="comment"> @Html.DisplayFor(model => model.createdat) @Html.ActionLink(Model.UserName, "Show", "Users", new { login = Model.UserLogin }, null) @if (Model.ModifiedAt!= null) { } <text> Last time modified at </text> Html.DisplayTextFor(model => model.modifiedat); <div class="comment-content"> @Html.DisplayFor(model => model.content) </div> </div> </div> 12
Layout: @RenderSection("scripts", required: false) Widok sekcje Widok potrzebujący dodatkowych skryptów: @section Scripts { @Scripts.Render("~/bundles/jqueryval") @Scripts.Render("~/bundles/jqueryui") @Scripts.Render("~/bundles/datetimepickers") } 13
Dlaczego ASP.NET MVC? Krótkie zestawienie z Ruby on Rails i Zend Framework 14
Porównanie Kryterium ASP.NET MVC Ruby on Rails Zend Framework Język ORM Zapytania do list obiektów C# lub VB (statyczny, silny) Tak, możliwość wyboru Ruby (dynamiczny, silny) Tak, brak wyboru (Active Record) LINQ brak brak Widoki section, partial partial partial Akcje Czytelne Szukanie parametrów za pomocą if PHP (dynamiczny, słaby) Tak, możliwość wyboru Czytelne IDE Visual Studio Aptana? Sublime? NetBeans? Koszt Bezpłatne Visual Studio Express Bezpłatne? Bezpłatne? 15
Baza danych Podstawa aplikacji web 2.0 16
ORM: Mapowanie relacji na obiekty Łączenie danych z wielu tabel w jeden obiekt Operacje CRUD 17
Współpraca z bazami danych ADO.NET Entity Framework: MS SQL Z dodatkowymi konektorami praktycznie każdy RDBMS NHibernate: większość systemów bazodanowych (out-of-box) 18
LINQ to Entities Zapytania LINQ do zmapowanych obiektów Składnia podobna do języka SQL Kompilowane w trakcie pierwszego wykonania 19
private readonly EventsCentreEntities _context = DatabaseProvider.Context; ( ) public void Update(Event model) { if (model == null) { throw new ArgumentNullException("model"); } LINQ to Entities var @event = _context.events.where(e => e.deleted == false).single(e => e.id == model.id); if (@event == null) throw new InvalidOperationException("Event is null value!"); @event.modifiedat = DateTime.Now; @event.deleted = model.deleted; @event.eventtypeid = model.eventtypeid; @event.serieid = model.serieid; @event.name = model.name; @event.description = model.description; @event.address = model.address; } _context.savechanges(); 20
Code First Napisz model i wygeneruj z niego bazę! Kod w całości pisany przez Ciebie Mniejsza kontrola nad bazą danych Doskonałe do szybkiego pisania aplikacji 21
Database First Wygeneruj modele z bazy danych! Wygenerowany kod jest usuwany przy odświeżaniu bazy na szczęście są to klasy partial Osobna kontrola nad bazą danych większa niezawodność Dobre dla systemów o wymaganej dużej niezawodności 22
Jak zacząć? 23
Jak zacząć? Tutoriale: Programowanie na żywo ASP.NET MVC 2: http://channel9.msdn.com/blogs/matthijs/aspnet-mvc-2-basics- Introduction-by-Scott-Hanselman Nowy projekt krok po kroku: http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnetmvc4/intro-to-aspnet-mvc-4 Przykładowy projekt ASP.NET MVC: http://nerddinner.codeplex.com/ Hosting: http://studentlive.pl/ http://appharbor.com/ 24
Q&A 25
Kamil Cieślak kamil.cieslak@outlook.com 26