Documente Academic
Documente Profesional
Documente Cultură
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.
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).
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(); } } }
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();
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()); } } }
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.
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.
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.