Michal Augustýn www.augi.cz Microsoft Most Valuable Professional
dříve převážně desktopové aplikace rozmach internetu poptávka po webových vývojářích ASP.NET WebForms snadný přechod - RAD mezitím jiné směry webového vývoje ASP.NET MVC přijetí jednoho z jiných směrů
framework pro tvorbu webových aplikací reakce na úspěch návrhového vzoru MVC u webových aplikací (RoR, Django, Zend FW) respektuje bezstavovost HTTP plná kontrola nad HTML modulární, rozšiřitelný zdrojáky dostupné na CodePlexu ne-rad vývoj není to náhrada WebForms
IIS ASP.NET WebForms MVC
Požadavek GET http://domena.cz/produkt/zobraz/10 IIS moduly ASP.NET [ISAPI filter] handler moduly Výsledek <html> </html>
request response 1 routing Controller 5 2-3 4 Model View
[HandleError] public class HomeController : Controller public ActionResult Index() ViewData["Message"] = "Welcome to ASP.NET MVC!"; return View(); public ActionResult About() return View();
určuje tvar url konfigurace v souboru Global.asax.cs pravidla se vyhodnocují v pořadí vložení mapuje zpracování url na kontroler a akční metodu umožňuje generování url výchozí nastavení: /Home/Product/20 routes.maproute( "Default", // Route name "controller/action/id", // URL with parameters new controller = "Home", action = "Index", id = "" // Parameter defaults );
třída odvozená od třídy Controller obsahuje akční metody (vrací ActionResult) 1. čte data z requestu 2. komunikuje s modelem 3. vybírá view a předává mu data k prezentaci Controller Model View
parametry requestu mapovány na vstupní parametry akční metody ( deserializace ) public ActionResult Show(int id) Routovací parametry: controller, action, id POST parametry: product.id, product.name, product.price public ActionResult Create(Product product) vlastní konverze - IModelBinder
slouží k zápisu výsledku do HttpResponse public abstract class ActionResult public abstract void ExecuteResult(ControllerContext context); return View("Index"); // ViewResult return PartialView("Product"); // PartialViewResult return Redirect("http://www.bing.com/"); // RedirectResult return RedirectToAction("Index"); // RedirectToRouteResult return File("soubor.txt", "txt/plain"); // FilePathResult return Json(myObject); // JsonResult return new MyRssResult(myCollection); // Rss(myCollection)
vlastní action-result na přesměrování public class MyRedirectResult : ActionResult public string Url get; set; public override void ExecuteResult(ControllerContext context) context.httpcontext.response.redirect(this.url); return new MyRedirectResult Url = "http://www.bing.com" ;
1. hash-table ViewData ViewData[ message ] = Hello world! ; 2. Model libovolná třída ViewData.Model = new MyViewModel(); typově bezpečné Controller Model View
všechny produkty public ViewResult Index() IEnumerable<Product> products = BusinessLayer.LoadAll(); return View(products); // ViewData.Model = products; jeden produkt public ViewResult Show(int id) Product p = BusinessLayer.Load(id); return View("Show", p);
editace produktu public ViewResult Update(int id) Product p = BusinessLayer.Load(id); return View("Update", p); [AcceptVerbs(HttpVerbs.Post)] public RedirectToRouteResult Update(int id, FormCollection formdata) Product p = BusinessLayer.Load(id); if (TryUpdateModel<Product>(p, formdata.tovalueprovider())) BusinessLayer..Update(p); return RedirectToAction("Update", new id = p.id );
defaultně se používá WebForms view-engine view == aspx stránka public ViewResult Show(int id) Product p = BusinessLayer.Load(id); return View("Show", p); <%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<Product>" %> <asp:content ID="indexTitle" ContentPlaceHolderID="TitleContent" runat="server >Home Page</asp:Content> <asp:content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server"> <h2><%= Html.Encode(ViewData["Message"]) %></h2> <p><%= Html.Encode(ViewData.Model.Name) %></p> </asp:content>
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<Product>" %> <asp:content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server"> Update product </asp:content> <asp:content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> <% using (Html.BeginForm()) %> <label for="name">name: </label><%= Html.TextBox("Name") %> <label for="description">desc: </label><%= Html.TextBox("Description") %> <input type="submit" name="submit" value="submit" /> <% %> </asp:content>
standardní umístění ~/Views/controller/view.aspx ~/Views/Shared/view.aspx lze změnit (stejně jako vše) partial views: UserControls (ascx) dědí z ViewUserControl<TModel> Html.RenderPartial( )
přijde request: routing: controller = Product action = Show id = 21 model-binding: id = 21 /Product/Show/21 public ViewResult Show(int id) Product p = BusinessLayer.Load(id); return View("Show", p);
public ViewResult Show(int id) Product p = BusinessLayer.Load(id); return View("Show", p); <%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<Product>" %> <asp:content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server"> Product details </asp:content> <asp:content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> <h2><%= Html.Encode(Model.Name) %></h2> <p><%= Html.Encode(Model.Description) %></p> <p>price: <%= Html.Encode(Model.Price) %></p> </asp:content>
aspektové rozšíření akčních metod lze aplikovat i na controllery [Authorize(Roles = "Admin")] [OutputCache(CacheProfile="TestProfile")] [HandleError(View="Error")] public ActionResult Test() return new EmptyResult();
public interface IAuthorizationFilter void OnAuthorization(AuthorizationContext filtercontext); public interface IActionFilter void OnActionExecuting(ActionExecutingContext filtercontext); void OnActionExecuted(ActionExecutedContext filtercontext); public interface IResultFilter void OnResultExecuting(ResultExecutingContext filtercontext); void OnResultExecuted(ResultExecutedContext filtercontext); public interface IExceptionFilter void OnException(ExceptionContext filtercontext);
metody RenderAction a Action volání akčních metod z view silně typový HTML helper: dříve: Html.TextBox( Prop ) nyní: Html.TextBoxFor(m => m.prop) vylepšené serverové validace klientské validace (včetně podpory jquery) areas další úroveň
templating: Html.DisplayFor(m => m.prop) Html.EditorFor(m => m.prop) asynchronní controllery pár dalších drobností
MVC jednoduché čistý kód nutí správně strukturovat plná kontrola nad html zezačátku vyžaduje více znalostí WebForms složitější model RAD, komponentový vývoj odstínění od stavovosti http ViewState, PostBack
http://asp.net/mvc http://haacked.com Phil Haack http://weblogs.asp.net/scottgu - ScottGu http://www.aspnetmvc.cz snad už brzy http://forum.builder.cz české fórum i o.net
a odpovědi