Sunteți pe pagina 1din 18

Framework-ul ASP.

NET MVC Antochi Anca Mihaela Sarghie Radu Pricop Lucian

Framework-ul ASP.NET MVC.................................................................................................................1 Introducere.................................................................................................................................................3 Ce este ASP.NET MVC?..........................................................................................................................3 Avantaje ASP.NET MVC.................................................................................................................4 Controller-ul..............................................................................................................................................5 Exemplu 1:........................................................................................................................................5 Aciunile unui controller...................................................................................................................6 Exemplu 2:........................................................................................................................................6 Exemplu 3:........................................................................................................................................7 View-ul......................................................................................................................................................8 Exemplu 4 \Views\Home\Index.aspx.............................................................................................8 Exemplu 5:........................................................................................................................................9 Exemplu 6 - ProductController.cs:..................................................................................................10 Exemplu 7 -- \Views\Product\Details.aspx.....................................................................................11 Modelul...................................................................................................................................................11 Exemplu 8 - Models\IMovieRepository.cs.....................................................................................11 Models\MovieRepository.cs............................................................................................................12 Controllers\MoviesController.cs.....................................................................................................12 Direcionare URL (URL Routing)..........................................................................................................13 Folosirea Tabelului implicit de direcionare...................................................................................13 Exemplu 8: .....................................................................................................................................13 Crearea unei rute proprii..................................................................................................................15 Exemplu 10 Global.asax ..............................................................................................................15 ArchiveController.cs.......................................................................................................................16 Creare unei aplicaii ASP.NET MVC cu Visual Studio..........................................................................17 Adugarea unei noi clase controller................................................................................................17 Adugarea unei clase view..............................................................................................................17 Concluzii.................................................................................................................................................18

Introducere
O dat cu apariia framework-ului ASP.NET, Microsoft a ncercat s implementeze modelul din windows forms n dezvoltarea de aplicaii web. Pentru a simula experiena programatorului din modelul windows forms, au fost introduse n web forms programarea bazat pe evenimente, Viewstate (pentru a persista schimbrile de stare ntre postback-uri) i Postback. Acestea au dus la nclcarea naturii far stare (stateless) a aplicaiilor web. Ciclul de via a unei pagini n acest model este complex i duce la o cuplare strns, avnd o singur clas pentru a afia interfaa la client i pentru tratarea intrrii de la utilizator. ASP.NET MVC este o alternativ pentru ASP.NET i cele dou variante vor co-exista. Ambele abordri in de alegerea programatorului.

Ce este ASP.NET MVC?


Framework-ul ASP.NET MVC implementeaz ablonul arhitectural Model-View-Controller pentru dezvoltare de aplicaii. ablonul MVC a fost introdus iniial n anul 1979 de ctre Trygve Reenskaug care lucra la limbajul Smalltalk. Principiul este de a mprii aplicaia n trei pri distincte: controllerul (primete i trateaz intrarea), modelul (conine logica aplicaiei) i view-ul (genereaz ieirea). n contextul aplicaiilor web, intrarea este cererea HTTP.

Figura1. Fluxul de cerere (request flow) n modelul web forms, intrarea ajunge n pagin (View-ul) i view-ul este responsabil att cu manipularea intrrii (input-ului), ct i cu generarea ieirii (outputului).

Avantaje ASP.NET MVC


Controlul integral asupra HTMLului redat. Separarea conceptelor (separation of concerns SoC). Folosirea cu uurina a programrii bazat pe teste (Test Driven Development - TDD). Respectarea designului fr stare a web-ului. Include o component de mapare a URL-urilor pentru crearea de aplicaii cu URL-uri simple, permind optimizarea pentru motoarele de cutare (SEO). Suport motoare de vizualizare cum ar fi NVelocity, Brail, NHaml.

Nu folosete modelul existent n web forms de postback pentru interaciunea cu serverul. Acest model a fost nlocuit cu direcionarea interaciunii utilizatorului la o clas Controller, astfel se realizeaz separarea conceptelor i uurina testrii. Framework extensibil. Framework MVC este proiectat pentru a fi uor de nlocuit i personalizat (de exemplu este posibil ca un alt motor de vizualizare s fie conectat sau regulile de rutare s fie personalizate). De asemenea suport injectare de dependene (dependecy injection) i modele de containere IOC (Windsor, Spring.Net, NHibernate, etc) .

Controller-ul
Controller-ul este responsabil cu primirea cererilor de la client (din browser). Fiecare cerere n browser este mapat la o clas controller. De exemplu, controller-ul poate returna la utilizator un view sau poate redirecta spre un alt controller. Numele unei clase controller trebuie s se termine cu sufixul Controller. De exemplu ProductController este corect, dar un controller cu numele Product nu va funciona (va arunca excepie). Un controller este o clas ce trebuie s extind clasa System.Web.Mvc.Controller.

Exemplu 1:
using System; using System.Web; using System.Web.Mvc; namespace MvcApp.Controllers { public class ProductController : Controller { public ActionResult Index() { // Add action logic here throw new NotImplementedException(); } } }

Aciunile unui controller


Un controller expune aciuni. O aciune este o metod n clasa controller-ului care este apelat atunci cnd utilizatorul introduce un URL n bara de adrese a browser-ului. n exemplul de mai sus, dac utilizatorul face o cerere pentru URL-ul http://localhost/Product/Index/3, metoda Index() din clasa ProductController este apelat. O aciune a controller-ului trebuie s fie o metod public. Trebuie avut n vedere faptul c orice metod public din clasa controller este automat expus ca o aciune a controller-ului. Astfel, poate fi apelat de oricine doar prin scrierea URL-ului corespunztor n bara de adrese a browser-ului. Mai exist i alte reguli ce trebuie respectate de o aciune a controller-ului: o metod folosit ca aciune nu poate fi suprancrcat i nu poate fi static. Ceea ce returneaz o aciune a unui controller reprezint rspunsul cererii de la browser. Framework-ul ASP.NET MVC suport sae tipuri standard de rezultat: 1. ViewResult Reprezint HTML. 2. EmptyResult Reprezint nici un rezultat. 3. RedirectResult Reprezint o redirectare spre un alt URL. 4. RedirectToRouteResult Reprezint o redirectare spre o alt aciune a controlerului. 5. JsonResult Reprezint un rezultat JavaScript Object Notation ce poate fi folosit intr-o aplicaie AJAX. 6. ContentResult Reprezint un rezultat text. Toate aceste clase ce pot fi returnate de o aciune extind clasa de baz ActionResult. n cele mai multe cazuri, aciunea controller-ului ntoarce un ViewResult.

Exemplu 2:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace MvcApp.Controllers { public class BookController : Controller { public ActionResult Index() {

return View(); } } } Cnd o aciune returneaz un ViewResult, la browser este returnat HTML. Metoda Index() din exemplu de mai sus returneaz la browser un view cu numele Index.aspx. Remarcai faptul c aciunea Index() din exemplu de mai sus nu returneaz ViewResult() direct. In schimb, metoda View() din clasa de baz Controller este apelat. De obicei, o aciune nu returneaz direct un rezultat, ci apeleaz una din metodele din clasa de baz Controller: 1. View Returneaz un rezultat ViewResult. 2. Redirect Returneaz un rezultat RedirectResult. 3. RedirectToAction Returneaz un rezultat RedirectToRouteResult. 4. RedirectToRoute Returneaz un rezultat RedirectToRouteResult. 5. Json Returneaz un rezultat JsonResult. 6. Content Returneaz un rezultat ContentResult.

Exemplu 3:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace MvcApp.Controllers { public class HomeController : Controller { public ActionResult Details(int? Id) { if (Id == null) return RedirectToAction("Index"); return View();

} public ActionResult Index() { return View(); } } }

View-ul
Spre deosebire de ASP.NET sau ASP, n ASP.NET MVC nu este inclus ceva ce n mod direct corespunde unei pagini. ntr-o aplicaie ASP.NET MVC nu exist o pagin pe disc ce corespunde cii din URL care a fost scris de utilizator n browser. Ceva apropiat de paginile din ASP.NET este n ASP.NET MVC un view. Dup cum a fost descris n seciunea despre controller, o cerere din browser este mapat unui controller, care poate returna un view. n exemplul 3, metoda Index() conine linia de cod: return View(); Acest linie de cod retuneaz un view care trebuie s se afle la urmtoarea cale pe serverul web: \Views\Home\Index.aspx Calea spre view este dedus din numele controller-ului i numele aciunii din controller. Dac preferai s specificai n mod explicit view-ul returnat, se poate face astfel: return View(Example); Linia de cod de mai sus returneaz un view cu numele Example, iar acest view este cutat la calea urmtoare: \Views\Home\Example.aspx View-ul trebuie adugat n directorul cu acelai nume ca i controller-ul care l returneaz (fr sufixul Controller). Un view este un document standard (X)HTML ce poate conine script-uri.

Exemplu 4 \Views\Home\Index.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Index.aspx.cs" Inherits="MvcApp.Views.Home.Index" %> <! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server">

<title>Index</title> </head> <body> <div> The current date and time is: <% Response.Write(DateTime.Now);%> </div> </body> </html> Se poate folosi orice limbaj .NET pentru a genera coninut dinamic ntr-un view. De cele mai multe ori Visual Basic .NET sau C# vor fi folosite. Pentru a fi mai uor s se adauge coninut la un view, se poate folosi un, aa numit, HTML Helper. Un HTML helper este o metod care returneaz un string i poate fi folosit pentru a genera elemente HTML standard, cum ar textbox-uri, link-uri, dropdown-uri, etc.

Exemplu 5:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Index3.aspx.cs" Inherits="MvcApp.Views.Home.Index3" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>Login Form</title> </head> <body> <div> <form method="post" action="/Home/Login"> <label for="userName">User Name:</label> <br /> <%=Html.TextBox("userName")%> <br /> <br /> <label for="password">Password:</label> <br /> <%=Html.Password("password")%>

<br /><br /> <input type="submit" value="Log In" /> </form> </div> </body> </html> Se poate, de asemenea, crea propriile HTML helpere. De exemplu, o metod helper GridView() care s afieze un set de cmpuri din baza de date. Se poate folosi o proprietate a view-ului, ViewData pentru a trasmite mai departe date din controller la un view. De exemplu, controller-ul din exemplul de mai jos adaug un mesaj la ViewData:

Exemplu 6 - ProductController.cs:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace MvcApp.Controllers { public class ProductController : Controller { public ActionResult Details() { ViewData["message"] = "Hello World!"; return View(); } } } ViewData este o colecie nume-valoare. View-ul din exemplul mai jos folosete mesajul din ViewData i red mesajul la browser.

Exemplu 7 -- \Views\Product\Details.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Details.aspx.cs" Inherits="MvcApp.Views.Product.Details" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>Product Details</title> </head> <body> <div> <%=Html.Encode(ViewData["message"])%> </div> </body> </html>

Modelul
Modelul MVC conine logica aplicaiei ce nu ine de view sau de controller. n particular, modelul MVC conine logica business a aplicaiei i accesul la baza de date. Pot fi folosite o varietate de tehnologii pentru a implementa logica de acces la baza de date, cum ar fi Microsoft Entity Framework, NHibernate, Subsonic, LINQ la SQL sau clase ADO.NET.

Exemplu 8 - Models\IMovieRepository.cs
using System.Collections.Generic; namespace MvcApplication1.Models { public interface IMovieRepository { IList<Movie> ListAll(); } }

Models\MovieRepository.cs
using System.Collections.Generic; using System.Linq; namespace MvcApplication1.Models { public class MovieRepository : IMovieRepository { private MovieDataContext _dataContext; public MovieRepository() { _dataContext = new MovieDataContext(); } public IList<Movie> ListAll() { var movies = from m in _dataContext.Movies select m; return movies.ToList(); } } }

Controllers\MoviesController.cs
using System.Web.Mvc; using MvcApplication1.Models; namespace MvcApplication1.Controllers { public class MoviesController : Controller {

private IMovieRepository _repository; public MoviesController() : this(new MovieRepository()) { } public MoviesController(ImovieRepository repository) { _repository = repository; } public ActionResult Index() { return View(_repository.ListAll()); } } }

Direcionare URL (URL Routing)


Direcionarea URL (URL Routing) este modulul responsabil cu maparea cererilor din browser la o aciune specific din controller.

Folosirea Tabelului implicit de direcionare


Direcionarea URL trebuie setat n dou locuri: 1. Fiierul de configurare (Web.config). Exist patru seciuni n fiierul de configurare ce sunt relevante pentru direcionare (routing): seciunea system.web.httpModules, seciunea system.web.httpHandlers, seciunea system.webserver.modules i sectiunea system.webserver.handlers. Fr aceste seciuni prezente n fiierul de configurare direcionarea nu funcioneaz. 2. Tabelul de direcionare este creat n fiierul Global.asax. Acesta este un fiier special ce conine tratarea (handler) evenimentelor din ciclul de via al aplicaiei ASP.NET. Tabelul de direcionare este creat n timpul evenimentului Application Start.

Exemplu 8:
using System;

using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Routing; namespace MyApp { public class GlobalApplication : System.Web.HttpApplication { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( // Route name "Default", //URL with parameters "{controller}/{action}/{id}", // Parameter defaults new { controller = "Home", action = "Index", id = ""}); } protected void Application_Start() { RegisterRoutes(RouteTable.Routes); } } } Cnd o aplicaie ASP.NET MVC ruleaz pentru prima dat, metoda Application_Start() este apelat. Aceast metod, la rndul ei, apleaz metoda RegisterRoutes(), care creaz tabela de direcionare (route table). Dac utilizatorul nu include un nume de controller n URL, atunci valoarea implicit este Home. Dac nu se ofer numele aciunii, aceasta va fi implicit Index, iar dac nu se ofer un id, parametrul id va fi un string gol. Mai jos avem un exemplu de cum ruta implicit mapeaz aciunile controller-ului:

Utilizatorul introduce n bara de adrese a browserului: /Home Aceasta duce la apelarea metodei Index din clasa HomeController using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace MyApp.Controllers { public class HomeController : Controller { public ActionResult Index(string Id) { return View(); } } } n exemplul de mai sus, clasa HomeController include o metod Index() ce accept un parametru Id, astfel metoda este apelat cu valoarea parametrului un string gol. Dac metoda Index ar avea un parametru de tip int care nu este nullable, apelarea URL-ului /Home ar aruncara o excepie.

Crearea unei rute proprii


Pentru aplicaii ASP.NET MVC simple, direcionarea implicit poate fi de ajuns, dar pentru aplicaii mai complexe este nevoie s se creeze rute proprii. De exemplu, pentru o aplicaie blog am putea avea nevoie s introducem un URL care ar arat astfel: / Archive/12-25-2009 Fiierul Global.asax din exemplul de mai jos conine o noua rut numit blog, care manipuleaz cererile care arat astfel: /Archive/entry date.

Exemplu 10 Global.asax
using System.Web.Mvc;

using System.Web.Routing; namespace MyApp { public class GlobalApplication : System.Web.HttpApplication { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( "blog", "Archive/{entryDate}", new {controller = "Archive", action = "Entry"} ); routes.MapRoute( "Default", // Route name "{controller}/{action}/{id}", // URL with parameters new { controller = "Home", action = "Index", id = ""} // Parameter defaults ); } protected void Application_Start() { RegisterRoutes(RouteTable.Routes); } } }

Ordinea n care rutele sunt adugate la tabelul de rutare este important. n exemlul de mai sus ruta blog este adaugat nainte de cea implicit. Dac ordinea ar fi inversat, ruta Default ar fi tot timpul apelat. Ruta proprie mapeaz toate cererile la un controller numit Archive i invoc metoda Entry(). Cnd metoda Entry() este chemat, data este pasat ca parametru.

ArchiveController.cs
using System;

using System.Web.Mvc; namespace MyApp.Controllers { public class ArchiveController : Controller { public string Entry(DateTime entryDate) { return "You requested the entry on " + entryDate.ToString(); } } } Metoda Entry() din exemplul de mai sus primete un parametru de tip DateTime. Framework-ul ASP.NET MVC va converti, n mod automat, data din URL ntr-o valoare de tip DateTime. Dac parametrul din URL nu poate fi convertit la DateTime, o excepie este aruncat.

Creare unei aplicaii ASP.NET MVC cu Visual Studio


Dup instalarea framework-ului ASP.NET MVC, n Visual Studio 2008 va exista un template pentru crearea de aplicaii ASP.NET MVC. Pentru un nou proiect selectai File/New Project apoi ASP.NET MVC Web Application. De fiecare dat cnd se creaz un nou proiect ASP.NET MVC, Visual Studio afieaz i posibilitatea de a crea un proiect separat de unit test. O aplicaie ASP.NET MVC are un set standard de directoare: Models, Views, Controllers, Scripts i Contents. La crearea aplicaiei cu ajutorul Visual Studio, se creaz n aceste directoare i fiiere ce ofer un exemplu pentru fiecare component.

Adugarea unei noi clase controller


O nou clas controller se poate aduga n Visual Studio prin click dreapta pe directorul Controllers, selectai Add, New Item i apoi selectai MVC Controller Class.

Adugarea unei clase view


Un view trebuie adugat n directorul protrivit. Dac se creaz un view pentru metoda aciune Index() a controller-ului HomeController, atunci clasa View trebuie plasat la calea urmtoare: \Views\Home\Index.aspx Cu Visual Studio se creaz un nou view prin click dreapta pe un subdirector din directorul Views i selectai Add, New Item, iar apoi selectai MVC View.

O dat cu ultima lansare a framework-ului (versiunea beta), se poate aduga un nou view din metoda aciune a unui Controller, click dreapta i selectai Add View (ca alternativa se poate folosi scurttura Ctrl-M Ctrl-V pentru a invoca meniul contextual far a lua minile de la tastatur). Visual Studio va pre-popula automat numele view-ului bazndu-se pe numele metodei aciune din care s-a deschis meniul.

Concluzii
Pentru programatorii care doresc s creeze aplicaii folosind arhitectura MVC, framework ASP.NET MVC este o opiune uoar i curat. Ofer posibilitatea de a menine uor separarea conceptelor n aplicaie, de asemenea, facilitatea de a crea unit teste i de a aborda programarea bazat pe teste.

S-ar putea să vă placă și