Poznaj ASP.NET MVC
Transkrypt
Poznaj ASP.NET MVC
Poznaj ASP.NET MVC Kamil Cieślak Microsoft Student Partner 2013-03-11 Czym jest ASP.NET MVC? Wzorzec MVC Agenda ASP.NET MVC vs inne frameworki Bazy danych w ASP.NET MVC Jak zacząć? 2 Czym jest ASP.NET MVC? 3 Framework do pisania aplikacji WWW C# lub Visual Basic po stronie serwera ASP.NET MVC 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 Kontroler [Authorize] public class EventsController : Controller { private readonly DatabaseEntities db = DatabaseProvider.Context; [HttpGet] Kontroler [AllowAnonymous] Akcja public ActionResult Details(int id = 0) { var @event = Event.Get(id); return View(@event); } } 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 routes.MapRoute( name: "Details", url: "{controller}/{id}", App_Data/RouteConfig.cs 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 /Users/Keraxel /Events/1 /Events/Details/1 /Events/Details/ 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; } public virtual IEnumerable<EventComment> EventComments { get; set; } Model 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 Łączenie kodu HTML z danymi z modelu Łączenie wielu widoków w jeden dokument HTML: Widok Layout Widok standardowy Widok częściowy (partial) Przekazywanie sekcji pomiędzy widokami Razor vs ASPX 11 Model @model EventsCentre.ViewModels.Shared.CommentDetailsViewModel <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) Widok @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 C# lub VB (statyczny, silny) Ruby (dynamiczny, silny) PHP (dynamiczny, słaby) ORM Tak, możliwość wyboru Tak, brak wyboru (Active Record) Tak, możliwość wyboru Zapytania do LINQ list obiektów brak brak Widoki section, partial partial partial Akcje Czytelne Szukanie parametrów Czytelne za pomocą if 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"); } var @event = _context.events .Where(e => e.Deleted == false) LINQ to Entities .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 Napisz model i wygeneruj z niego bazę! Code First Kod w całości pisany przez Ciebie Mniejsza kontrola nad bazą danych Doskonałe do szybkiego pisania aplikacji 21 Wygeneruj modele z bazy danych! Wygenerowany kod jest usuwany przy odświeżaniu bazy Database First …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 Tutoriale: Programowanie na żywo – ASP.NET MVC 2: http://channel9.msdn.com/Blogs/matthijs/ASPNET-MVC-2-BasicsIntroduction-by-Scott-Hanselman Jak zacząć? 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 [email protected] 26