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)
&#183;
@Html.ActionLink(Model.UserName, "Show", "Users", new { login = Model.UserLogin }, null)
Widok
@if (Model.ModifiedAt != null)
{
<text> &#183; 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

Podobne dokumenty