Fiecare cerere către aplicație este procesată de controlor. Controlorul poate procesa cererea în mod arbitrar până când depășește limita responsabilității modelului și a vizualizării. Aceasta înseamnă că controlorii nu trebuie să conțină sau să stocheze date și nici să genereze interfețe utilizator.
Într-un MVC Framework ASP.NET, controlorii sunt clase .NET care conțin logica necesară procesării cererii. Rolul controlerului este de a încapsula logica aplicației. Cu alte cuvinte, controlorii sunt responsabili pentru procesarea cererilor de intrare, efectuarea operațiilor asupra modelului de domeniu și selectarea vizualizărilor pentru vizualizare către utilizator.
Exemple de aplicații
În sensul prezentului și următoarele articole, vom crea un nou proiect MVC numit ControllersAndActions utilizând șablonul gol (Blank), observând caseta MVC în Adăugați foldere și referințe de bază pentru (Adăugați foldere și link-uri de bază), precum și de proiect unitate de testare numit ControllersAndActions Teste. teste unitare care vor fi create, implementările simulate nu necesită acest lucru pachet Moq nu are nevoie pentru a instala, dar trebuie să instalați pachetul MVC că testele au acces la clasa controler de bază.
În consola Visual Studio NuGet Packet Manager, introduceți următoarea comandă:
Conceptul de controlor
Crearea unui controler folosind interfața IController
În cadrul MVC, clasele de controler trebuie să implementeze interfața IController din spațiul de nume System.Web.Mvc. prezentate în exemplul de mai jos:
Pentru a obține definiția acestei interfețe, trebuie să descărcați codul sursă pentru MVC Framework. Este extrem de utilă pentru clarificarea funcționării interne a infrastructurii.
După cum puteți vedea, interfața IController este foarte simplă. Singura sa metodă de Execute () este apelată atunci când cererea este direcționată către această clasă de controler. MVC Framework determină ce clasă este orientată interogarea prin citirea valorii proprietății controlerului generată de informațiile de rutare sau prin clase speciale de rutare.
Puteți crea clasele de controler prin implementarea interfeței IController, dar din moment ce această interfață este la un nivel scăzut, va fi nevoie de multă muncă pentru a obține, eventual, ceva util. Cu toate acestea, interfața IController este utilă pentru a demonstra funcționarea controlorilor și în acest scop este creat un nou fișier de clasă numit BasicController.cs în folderul Controllers, al cărui conținut este prezentat în exemplul de mai jos:
Obiectul RequestContext este trecut la metoda Execute () a interfeței IController. oferind informații despre cererea curentă și despre ruta care îi corespunde (și conduce la apelul acestui controler pentru a face față acestei solicitări). Clasa RequestContext definește două proprietăți descrise în tabelul de mai jos:
Proprietăți definite de clasa RequestContext
Returnează o colecție de valori segmentate indexate după nume
Articolul Configurarea sistemului de rutare a arătat modul de utilizare a tipurilor RouteBase și IRouteHandler pentru a configura sistemul de rutare. În acest exemplu, utilizând proprietatea Valori, se obțin valorile controlerului variabil și segmente de acțiune, care sunt apoi scrise în răspuns.
O parte a problemei care apare atunci când se creează controlere speciale se datorează lipsei de acces la unelte precum vizualizări. Aceasta înseamnă că va trebui să lucrați la un nivel inferior, ceea ce explică înregistrarea conținutului direct ca răspuns la client. Proprietatea HttpContextBase.Response returnează un obiect HttpResponseBase. care vă permite să configurați și să adăugați conținut la răspunsul destinat trimiterii către client. Acesta este un alt punct de contact între platforma ASP.NET și MVC Framework.
Dacă porniți aplicația și mergeți la adresa URL a formularului / Basic / Index, controlerul special va genera ieșirea din figura de mai jos:
Implementarea interfeței IController vă permite să creați o clasă pe care MVC Framework o recunoaște ca un controler și trimite solicitări către aceasta, fără restricții privind modul în care este tratată cererea și ce răspuns este generat pentru aceasta. Acesta este un exemplu bun, deoarece arată cât de extensibilă poate fi MVC Framework chiar și pentru blocurile cheie cum ar fi controlorii, dar scrierea unei aplicații complexe în acest mod poate fi foarte dificilă.
Clase cu nume care se termină în baza
La procesarea cererilor, MVC Framework se bazează pe platforma ASP.NET, ceea ce face multă sens. Această platformă este o implementare bogată și dovedită, care se integrează strâns cu serverul de aplicații IIS. Problema este că clasele folosite de platforma ASP.NET pentru a furniza informații de interogare nu sunt potrivite pentru testarea unităților - principalul avantaj al utilizării MVC Framework.
Microsoft a decis să introducă capacitatea de testare, menținând în același timp compatibilitatea cu aplicațiile existente în ASP.NET Web Forms, astfel încât clasele de bază să apară ca rezultat. Aceste clase sunt numite astfel deoarece au aceleași nume ca și clasele principale de platformă ASP.NET, urmate de cuvântul Base.
De exemplu, platforma ASP.NET oferă informații contextuale despre cererea curentă și o serie de servicii de aplicații cheie prin obiectul HttpContext. Clasa Base sa corespunzătoare este HttpContextBase, a cărui copie este trecut de a executa (), definit în interfața IController (și celelalte clase de bază va fi demonstrată în următoarele exemple). Clasele originale și clasele de bază au aceleași proprietăți și metode definite, dar clasele de bază sunt întotdeauna abstracte. ceea ce înseamnă că sunt ușor de aplicat pentru testarea unității.
Uneori obțineți o instanță a uneia dintre clasele ASP.NET originale, cum ar fi HttpContext. În acest caz, trebuie să creați o clasă Bază prietenoasă MVC, similară cu HttpContextBase. Acest lucru se face folosind una din clasele Wrapper. care au aceleași nume ca clasele originale, completate de cuvântul Wrapper, de exemplu, HttpContextWrapper. Modelele de tip Wrapper sunt derivate din clasele de bază și au constructori care acceptă exemple ale claselor originale:
Clasele inițiale, clasele de bază și clasele Wrapper sunt definite în spațiul de nume System.Web, astfel încât ASP.NET poate sprijini fără probleme aplicațiile MVC Framework și aplicațiile de Formulare Web mai vechi.
Crearea unui controler prin moștenire din clasa Controller
După cum sa demonstrat în exemplul anterior, cadrul MVC permite configurarea și extinderea aproape nelimitată. Pentru a furniza orice tip de procesare a interogărilor și generarea de rezultate dorite, puteți implementa interfața IController. Nu vă place metodele de acțiune? Nu vreți să vă faceți griji cu privire la vizualizări? În acest caz, puteți să vă ocupați de propriile mâini și să implementați o modalitate mai bună, mai rapidă și mai elegantă de procesare a cererilor. Alternativ, puteți utiliza instrumentele oferite de echipa MVC Framework de la Microsoft și moșteniți controlorii dvs. din clasa System.Web.Mvc.Controller.
Comportamentul controlerului este distanțat într-o varietate de metode (în loc să fie implementat ca o singură metodă Execute ()). Fiecare metodă de acțiune este mapată la adresa URL corespunzătoare și se numește cu parametrii extrași din cererea de intrare.
Puteți să returnați un obiect care descrie rezultatul acțiunii (de exemplu, redarea vizualizării sau redirecționarea către o altă adresă URL sau o metodă de acțiune) și apoi procesarea acesteia în orice mod. Separarea dintre indicarea rezultatelor și efectuarea acestora simplifică testarea unităților.
Modul de utilizare reutilizabil (de exemplu, autentificare) poate fi încapsulat ca filtre și apoi eticheta fiecare aspect al comportamentului controlorilor și metodelor de acțiune folosind un atribut din codul sursă.
Doar dacă nu de-a face cu o cerință specifică, cea mai bună abordare pentru crearea controlorilor vor fi moștenirea lor de la software-ul controler de clasă, care, după cum s-ar putea aștepta, face mediul Visual Studio la crearea unei noi clase, ca răspuns la selectarea elementului de meniu Add -> Schele (adăugați -> șablon).
Exemplul de mai jos arată codul pentru un controler simplu numit DerivedController, creat în acest fel. Acesta este generat utilizând varianta MVC 5 Controller - Empty (MVC 5 - Empty) cu câteva modificări simple, concepute pentru a seta proprietatea ViewBag și a selecta o vizualizare:
Clasa Controller oferă, de asemenea, o legătură către sistemul de vizualizare Razor. În acest exemplu, vom returna rezultatul apelului la metoda View (), care transmite parametrul numele clientului ca parametru. Pentru a crea acest punct de vedere, de a crea Vizualizari / dosar derivate, faceți clic pe butonul din dreapta al mouse-ului și faceți clic pe elementul de meniu Add -> 5 MVC View Pagina (aparat de ras) (Add -> Pagina 5 din MVC (Razor)). Specificați numele MyView.cshtml și faceți clic pe OK pentru a crea fișierul de vizualizare.
Dați conținutul fișierului conform exemplului:
După pornirea aplicației și navigarea la adresa URL a ferestrei / Derived / Index, această metodă de acțiune este apelată și vizualizarea MyView este redată: