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