ASP.NET --- ASP.NET MVC 5 --- Creați un motor de vizualizare special
Vom merge la extreme și vom crea un mecanism special de vizualizare. În majoritatea proiectelor, nu trebuie să faceți acest lucru, deoarece ASP.NET MVC Framework are un motor de vizualizare Razor încorporat. Acest mecanism a fost folosit în toate exemplele date mai devreme.
Valoarea creării unui mecanism de vizualizare specială constă în demonstrarea funcționării conductei de procesare a cererilor și completarea descrierii cadrului ASV.NET MVC. Aceasta implică, de asemenea, înțelegerea cît de multă libertate are mai mare mecanismele de vizualizare atunci când traduce ViewResult ca răspuns la client. Mecanismele de vizualizare implementează interfața IViewEngine. care este prezentat în exemplul de mai jos:
Rolul motorului de vizualizare este de a traduce cererile de vizualizare către obiectele ViewEngineResult. Primele două metode în interfața - FindPartialView () și FindView () - să accepte parametri care descriu solicitarea și prelucrarea controlerului (obiect ControllerContext) său, numele prezentării și aspectul, precum și o indicație dacă mecanismul de formare a imaginii este permis să reutilizați rezultatul anterior este în cache . Aceste metode sunt numite în timpul procesării ViewResult. Ultima metodă, ReleaseView (), este apelată atunci când vizualizarea nu mai este necesară.
Suportul pentru mecanismele de vizualizare din MVC Framework este implementat de clasa ControllerActionInvoker. care este o implementare încorporată a interfeței IActionInvoker. Dacă implementați propria fabrică de activatoare de acțiuni sau controler direct din interfețele IActionInvoker sau IControllerFactory, nu veți avea acces automat la instrumentul de vizualizare.
Clasa ViewEngineResult permite motorului de vizualizare să răspundă la MVC Framework atunci când este solicitată o vizualizare. Codul pentru clasa ViewEngineResult este prezentat în exemplul de mai jos:
Rezultatul este exprimat prin alegerea unuia dintre cei doi constructori. Dacă motorul de vizualizare creat independent este capabil să furnizeze o vizualizare pentru interogare, atunci ViewEngineResult este creat utilizând următorul constructor:
Ca parametri pentru acest constructor, implementarea interfeței IView și a obiectului motorului de randare sunt transmise (astfel încât metoda ReleaseView () poate fi apelată mai târziu). Dacă motorul de randare nu poate oferi o vizualizare pentru interogare, atunci se utilizează următorul constructor:
Parametrul acestei versiuni a constructorului este enumerarea locurilor în care ar trebui efectuată căutarea vizualizării. Așa cum va fi arătat mai târziu, această informație este afișată utilizatorului în cazul în care vizualizarea nu a fost găsită.
Dacă credeți că clasa ViewEngineResult este oarecum inconvenient de folosit, atunci nu sunteți singuri cu opinia dvs. Exprimarea rezultatelor utilizând mai multe versiuni ale constructorului de clasă este o abordare ciudată care este complet incompatibilă cu restul deciziilor de proiectare care formează baza MVC Framework.
Ultima construcție în sistemul de vizualizare este interfața IView. care este prezentat în exemplul de mai jos:
Implementarea IView este transmisă constructorului ViewEngineResult, a cărui instanță este returnată din metodele motorului de randare. Cadrul MVC apoi apelează metoda Render (). Parametrul ViewContext raportează informații despre solicitarea de la client și despre ieșirea din metoda de acțiune. Parametrul TextWriter este folosit pentru a scrie ieșirea pe partea clientului.
Clasa ViewContext definește proprietățile care oferă acces la informații despre interogare și detalii despre modul în care a fost gestionat de MVC Framework până în prezent. Cele mai utile proprietăți ale acestei clase sunt descrise în tabelul de mai jos:
Proprietăți utile ale clasei ViewContext
Returnează dicționarul de date al modelului de vizualizare, care conține și date și metadate ViewBag pentru model. Detalii sunt prezentate în tabelul de mai jos.
Cea mai interesantă proprietate a tuturor este ViewData, care returnează un obiect ViewDataDictionary. Clasa ViewDataDictionary definește câteva proprietăți utile care oferă acces la metadatele modelului de vizualizare, ViewBag și modelului de prezentare. Cele mai utile proprietăți ale clasei ViewDataDictionary sunt descrise în următorul tabel:
Proprietăți utile ale clasei ViewDataDictionary
Returnează informații despre starea modelului
După cum am menționat mai devreme, vedeți cum funcționează totul, adică Cum funcționează împreună IViewEngine, IView și ViewEngineResult este cel mai ușor prin crearea unui motor de vizualizare. Vom construi un simplu mecanism de vizualizare care returnează un fel de reprezentare. Această vizualizare va afișa rezultatul, care conține informațiile despre solicitare și datele de vizualizare generate de metoda de acțiune. O astfel de abordare permite demonstrarea modului în care mecanismele de vizualizare funcționează fără a distrage parsarea șabloanelor de prezentare.
Pregătirea proiectului pentru un exemplu
Pentru acest articol, am creat un nou proiect MVC numit Vizualizări utilizând șablonul Golit și pavilionul MVC în dosarul Adăugare și referințe de bază pentru secțiune. Controlerul de acasă este adăugat la proiect, al cărui cod este prezentat în exemplul de mai jos:
În acest proiect, nu sunt create vederi, deoarece, în loc să lucreze cu Razor, va fi implementat un mecanism special de vizualizare.
Crearea unei implementări speciale a programului IView
Să începem prin crearea unei implementări a interfeței IView. Pentru a face acest lucru, folderul Infrastructure este adăugat la proiectul de eșantion, în interiorul căruia este creat un fișier de clasă numit DebugDataView.cs cu conținutul prezentat în exemplul de mai jos:
Această vizualizare demonstrează utilizarea a doi parametri ai metodei Render (): obținem valori din ViewContext și scriem răspunsul clientului utilizând TextWriter. În primul rând, datele de rutare sunt afișate, apoi datele ViewBag.
Instrumentul de vizualizare a datelor este o moștenire a versiunilor anterioare ale MVC Framework care au fost lansate înainte de suportul obiectelor dinamice din C #. Prezentarea datelor - este mai puțin flexibil predecesorul date ViewBag și au folosit nu mai direct, cu excepția cazurilor în care există implementare specială a Iview și au nevoie pentru a oferi un acces facil la proprietățile definite în ViewBag obiect.
Crearea unei implementări IViewEngine
Rețineți că motorul de vizualizare este proiectat pentru a construi un obiect ViewEngineResult care conține fie IView, fie o listă de locuri pentru a căuta o vizualizare adecvată. Acum că există o implementare de lucru a IView, puteți crea un motor de vizualizare. Pentru a face acest lucru, se adaugă un nou fișier de clasă numit DebugDataViewEngine.cs în folderul Infrastructure, al cărui conținut este prezentat în exemplul de mai jos:
Planificăm să acceptăm o singură vizită numită DebugData. Atunci când o interogare este trimisă pentru această vizualizare, vom returna o nouă instanță a implementării noastre IView, după cum urmează:
Dacă vom implementa un motor de vizualizare mai serios, am putea căuta modele, ținând cont de setările de aspect și de cache. În această situație, exemplul nostru simplu necesită crearea doar a unei noi instanțe a clasei DebugDataView. Dacă se primește o solicitare pentru o altă vizualizare decât DebugData, atunci ViewEngineResult se returnează după cum urmează:
Interfața IViewEngine presupune că motorul de vizualizare cunoaște locurile în care ar trebui să caute vizionări. Aceasta este o presupunere rezonabilă, deoarece Reprezentările sunt de obicei fișiere șablon care sunt stocate ca fișiere de proiect. În acest caz, nu este nimic de căutat, astfel încât pur și simplu o locație fictivă este returnată, indicând faptul că o prezentare a fost solicitată care nu poate fi livrată.
Un motor special de redare nu acceptă reprezentări parțiale, astfel încât rezultatul returnat din metoda FindPartialView () indică faptul că vizualizarea nu este prezentă. Metoda ReleaseView () nu a fost implementată, deoarece nu există resurse care ar trebui să fie eliberate în implementarea IView, care se face de obicei prin această metodă.
Înregistrarea unui mecanism special de vizualizare
Mecanismele de vizualizare sunt înregistrate în metoda Application_Start () din fișierul Global.asax, după cum se arată mai jos:
Colecția statică ViewEngine.Engines conține un set de mecanisme de vizualizare instalate în aplicație. MVC Framework sprijină ideea de a avea mai multe mecanisme instalate într-o singură aplicație. În timpul procesării ViewResult, activatorul de acțiune primește un set de motoare de vizualizare instalate și, la rândul său, apelează metodele lor FindView ().
Testarea mecanismului de vizualizare
Acum puteți testa un motor de vizualizare special. Când aplicația începe, browserul navighează automat la adresa URL rădăcină a proiectului, care va fi afișată în acțiunea Index a controlerului de acasă. Această metodă de acțiune utilizează metoda View () pentru a returna un obiect ViewResult care indică vizualizarea DebugData. Rezultatul poate fi văzut în figura de mai jos:
Acesta este rezultatul chemării metodei FindView () pentru o vizualizare pe care o putem procesa. Dacă te duci la o adresă URL cum ar fi / Acasă / Listă, acțiuni MVC-cadru de infrastructură va determina Lista metoda (), care se referă la metoda View () pentru a solicita prezentarea standard, dar acest punct de vedere nu este acceptată. Rezultatul este arătat în figură:
Mesajul este afișat ca fiind una dintre locațiile în care a fost căutat vizualizarea. Rețineți că vizualizările Razor și ASPX sunt de asemenea prezente în listă; Motivul este că aceste mecanisme de vizualizare sunt încă folosite. Dacă este necesar să furnizați doar un mecanism special de vizualizare, atunci înainte de a-l înregistrați în fișierul Global.asax, trebuie să apelați metoda Clear ():
Repornind aplicația și mergând la / Home / List, veți observa că va fi utilizat doar un mecanism special de vizualizare: