Podstawy wzorca MVC MODEL KON- TROLER WIDOK Zawiera dane aplikacji oraz jej logikę. MODEL WIDOK Odpowiada za wyświetlenie danych użytkownikowi KON- TROLER KON- TROLER MODEL WIDOK Jedyna część aplikacji, która może kontaktować się ze stałymi źródłami danych. Najczęściej występuje pod postacią zestawu klas realizujących mapowanie relacyjno-obiektowe. Odpowiada za warstwę prezentacyjną Najczęściej widok generuje dane w postaci (X)HTML, JSON, Dobrze napisany widok kontaktuje się tylko z modelem, wykorzystuje tylko pętle i instrukcje warunkowe. 1
Stanowi serce każdej aplikacji wykorzystującej wzorzec MVC. KON- TROLER MODEL WIDOK żądanie HTTP Kontroler Model Widok Pobierz dane() Obsługuje żądania HTML Decyduje jakie akcje należy wykonać Łączy się z modelem w celu pobrania lub zmodyfikowania danych Tworzy widok i zwraca go do użytkownika Wczytaj Widok(model) Odpowiedź HTTP Pobierz dane Bootstrapper żądanie HTTP Stworz() Wykonaj() Kontroler frontowy Stworz() Kontroler strony Pobierz dane() Model Wczytaj Widok(model) Pobierz dane Widok //Require Components require_once('../application/models/front.php'); require_once('../application/models/icontroller.php'); require_once('../application/models/view.php'); //Require Controllers require_once('../application/controllers/index.php'); //Initialize the FrontController $front = FrontController::getInstance(); $front->route(); echo $front->getbody(); Odpowiedź Odpowiedź Odpowiedź Odpowiedź Kevin McArthur Pro PHP: Patterns, Frameworks, Testing and More, Apress 2008 2
private function construct() $request = $_SERVER['REQUEST_URI']; $splits = explode('/', trim($request,'/')); $this->_controller =!empty($splits[0])?$splits[0]:'index'; $this->_action =!empty($splits[1])?$splits[1]:'index'; if(!empty($splits[2])) $keys = $values = array(); for($idx=2, $cnt = count($splits); $idx<$cnt; $idx++) if($idx % 2 == 0) //Is even, is key $keys[] = $splits[$idx]; else //Is odd, is value; $values[] = $splits[$idx]; $this->_params = array_combine($keys, $values); Kevin McArthur Pro PHP: Patterns, Frameworks, Testing and More, Apress 2008 public function route() if(class_exists($this->getcontroller())) $rc = new ReflectionClass($this->getController()); if($rc->implementsinterface('icontroller')) if($rc->hasmethod($this->getaction())) $controller = $rc->newinstance(); $method = $rc->getmethod($this->getaction()); $method->invoke($controller); else throw new Exception("Action"); else throw new Exception("Interface"); else throw new Exception("Controller"); Kevin McArthur Pro PHP: Patterns, Frameworks, Testing and More, Apress 2008 Podstawy ASP.NET MVC Jest alternatywną (do web forms) metodą budowania aplikacji www w technologii ASP.NET Jest frameworkiem open source Możliwa jest podmiana dowolnego elementu frameworka Pozwala na korzystanie z kontroli typów 3
Kontroler ASP.NET MVC jest klasą, która: dziedziczy po klasie Controller zawiera metody (akcje) przetwarzające poszczególne żądania metoda akcji powinna być publiczna i najczęściej zwraca obiekt dziedziczący po klasie ActionResult Wymagania względem akcji: metoda musi być publiczna metoda nie może być statyczna metoda nie może być metodą rozszerzającą metoda nie może być kontruktorem, ani metodą typu getter czy setter metoda nie może być szablonowa metoda nie jest metodą z klasy bazowej kontrolera (Controller) metoda nie może zawierać atrybutów typu ref i out. 4
Typy pochodne z ActionResult: Typ ViewResult EmptyResult RedirectResult RedirectToRouteResult JsonResult JavaScriptResult ContentResult FileContentResult FilePathResult FileStreamResult Opis Reprezentuje rezultat w postaci danych XHTML Brak wyniku Reprezentuje przekierowanie do innego adresu URL Reprezentuje przekierowanie do innej trasy Reprezentuje rezultat w postaci JSON Reprezentuje rezultat w postaci skryptu JavaScript Reprezentuje rezultat w postaci tekstowej Reprezentuje rezultat w postaci pliku możliwego do ściągnięcia jak wyżej jak wyżej Metody kontrolera Typ View Redirect RedirectToAction RedirectToRoute Json JavaSriptResult Content File Opis Zwraca obiekt ViewResult Zwraca obiekt RedirectResult Zwraca obiekt RedirectResult Zwraca obiekt RedirectToRouteResult Zwraca obiekt JsonResult Zwraca obiekt JavascriptResult Zwraca obiekt ContentResult Zwraca obiekt FileContentResult, FilePathResult lub FileStreamResult zależnie od podanych parametrów ERROR public ActionResult Create(CategoryModel data) if(modelstate.isvalid) csi.savedata(data); var categories = csi.getcategories(); return View("index", categories); else return View(data); 5
public ActionResult Create(CategoryModel data) if(modelstate.isvalid) csi.savedata(data); return RedirectToAction("index"); else return View(data); Widoki ASPX Razem z ASP.NET MVC 3 Razor Spark NHtml. (może coś własnego) ASPX: <% %> <%= %> <%: %> Razor: @ 6
Standardowo dane do zwykłych widoków możemy przekazywać za pomocą jednej dwóch metod: słownik ViewData obiekt dynamiczny ViewBag W przypadku obu metod łatwo o pomyłkę podczas tworzenia widoków! public ActionResult Index() Model m = WczytajModel(); ViewData["Imie"] = m.imie; ViewData["Nazwisko"] = m.nazwisko; ViewData["Wiek"] = m.wiek; return View(); <asp:content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> <h2> <%= ViewData["Imie"] %> <%: ViewData["Nazwisko"] %> </h2> <p> <%= ViewData["Nazwisko"] %> </p> </asp:content> 7
public ActionResult Index() Model m = WczytajModel(); ViewBag.Imie = m.imie; ViewBag.Nazwisko = m.nazwisko; ViewBag.Wiek = m.wiek; return View(); <h2>@viewbag.imię @ViewBag.Nazwisko</h2> <p> Wiek: @ViewBag.Wiek </p> Domain model Data Set LinqTo SQL Entity Framework View model Proste klasy Opisują te dane, które mają się wyświetlać na stronie 8
public class CategoryBrowseModel public string Name set; get; public int ID set; get; public int PlantsCount set; get; Dane do widoku przekazywane są jako obiekt konkretnej klasy, a nie jako kolekcja, czy obiekt dynamiczny. Dostęp do danych w widoku możliwy jest za pomocą zmiennej Model. ASPX: <h2 style="color: <% if(viewbag.wiek <= 30)%> orange <% else%>red<% %>"> <%: ViewBag.Imie %> <%: ViewBag.Nazwisko %></h2> Razor: <h2 style="color: @if(viewbag.wiek <= 30) <text>orange</text> else<text>red</text>"> @ViewBag.Imie @ViewBag.Nazwisko</h2> 9
<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage< System.Collections.Generic.List<MvcApplication1.Models.OsobaViewModel>>" %> <asp:content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> <ul> <% foreach(var osoba in Model) %> <li><%: osoba.imie %> <%: osoba.nazwisko %></li> <%%> </ul> </asp:content> @model System.Collections.Generic.List<MVC3_test.Models.OsobaViewModel> <ul> @foreach(var osoba in Model) <li>@osoba.imie @osoba.nazwisko</li> </ul> ActionLink BeginForm DisplayFor DisplayTextFor EditorFor CheckBoxFor DropDownListFor HiddenFor LabelFor ListBoxFor PasswordFor RadioButtonFor TextAreaFor TextBoxFor ValidateFor ValidationMessageFor ValidationSummary 10
<area>/views/<controllername>/editortemplates/<templatename>.ascx <area>/views/shared/editortemplates/<templatename>.ascx Views/<ControllerName>/EditorTemplates/<TemplateName>.ascx Views/Shared/EditorTemplates/<TemplateName>.ascx 11