Mvc 5, metode speciale de ajutor

În acest articol ne vom uita la metode ajutătoare, care să permită porțiunea de ambalare și marcare a codului, astfel încât acestea să poată fi reutilizate în cadrul aplicației ASP.NET MVC-cadru. Vom începe să vă arătăm cum să vă creați propriile metode auxiliare.







Exemple de aplicații

În sensul prezentului articol în Visual Studio a creat un nou proiect numit MVC HelperMethods folosind șablonul gol (Blank) și casetele marca MVC sub Adăugați directoare și referințe de bază pentru (Adăugați foldere și link-uri de bază). Controlerul de acasă este adăugat la proiect, al cărui cod este prezentat în exemplul de mai jos:

În metoda de operare Index (), o pereche de matrice de șir este trecută spre vizualizare prin obiectul ViewBag, iar tipul de șir este specificat ca obiect model. În dosarul / Views / Home, fișierul de vizualizare Index.cshtml a fost creat cu conținutul afișat în exemplul de mai jos. Aceasta este o reprezentare puternic tipărită (cu tipul modelului de șir) și nu se aplică niciun aspect.

Pentru a vedea cum este redată această vizualizare, trebuie să porniți aplicația. Configurația standard de rutare adăugată proiectului de către mediul Visual Studio va afișa adresa URL rădăcină solicitată automat de browser pentru acțiunea Index din controlerul Home:

Mvc 5, metode speciale de ajutor

Crearea unor metode de asistență speciale

Vom explica lucrarea metodelor auxiliare folosind exemplul creării propriei noastre implementări. În secțiunile următoare se vor prezenta două abordări diferite privind crearea unor metode auxiliare speciale.

Crearea unei metode helper încorporate

Cel mai simplu tip de metodă auxiliară este metoda auxiliară încorporată, care este definită în interiorul reprezentării. Putem crea o metodă inline pentru a simplifica reprezentarea eșantionului folosind descriptorul @helper. după cum se arată în exemplul de mai jos:

Ca și metodele obișnuite C #, metodele helper built-in au nume și parametri. În acest exemplu, a fost definită o metodă helper numită ListArrayStringItems () care ia un șir de șir ca parametru. Deși metoda helper inline arată ca o metodă, valoarea returnată lipsește. Conținutul corpului de metodă auxiliară este procesat și plasat în răspunsul destinat clientului.

Rețineți că atunci când utilizați o metodă helper încorporată, nu este necesar să aruncați proprietățile dinamice ale obiectului ViewBag la un șir de șir. Una dintre trăsăturile acestui tip de metode de ajutor este legată de tipul de evaluare în timpul execuției.

În corpul metodei helper încorporate, aceeași sintaxă este utilizată ca în restul vederii Razor. Fonturile literale sunt tratate ca marcări statice HTML, iar operatorii care necesită prelucrarea Razor sunt prefixați cu un caracter @. Metoda Helper în exemplul mixează de marcare HTML static și Razor mânere pentru a transfera matrice, rezultând aceeași ieșire ca ideea inițială, dar reduce duplicarea în cadrul prezentării.

Avantajul acestei abordări este că, dacă trebuie să modificați modul în care sunt afișate conținutul matricei, trebuie doar să faceți acest lucru într-un singur loc. Ca un exemplu simplu, exemplul de mai jos arată modul de utilizare a elementelor dintr-o listă HTML fără numere în loc de afișarea doar a valorilor:

Modificările trebuiau făcute doar într-un singur loc. Acest lucru poate părea un avantaj nesemnificativ într-un proiect simplu, dar este o modalitate convenabilă de a menține opiniile simple și coerente într-un proiect real. Rezultatul modificărilor efectuate este prezentat în figura de mai jos:

Mvc 5, metode speciale de ajutor

Rețineți că în exemplul de mai sus, cuvântul cheie predecesor trebuie să aibă un prefix @, dar în exemplul de mai sus, acest lucru nu este cazul. Motivul este că primul element din corpul metodei helper a fost schimbat pentru a deveni un element HTML, ceea ce înseamnă că trebuie să utilizați simbolul @ pentru a spune Razor despre utilizarea operatorului C #. În exemplul anterior, nu au existat elemente HTML, astfel încât mecanismul Razor a sugerat că conținutul este un cod. Asemenea caracteristici mici ale instrumentelor de analiză pot fi dificil de urmărit, dar, din fericire, mediul Visual Studio marchează erori de acest tip.

Crearea unei metode externe de ajutor

Metodele helper integrate sunt convenabile, dar ele sunt doar în cadrul pot fi folosite vizualizarea, care sunt declarate, iar în cazul în care astfel de metode includ o mulțime de cod, reprezentarea devine dificil de citit.

O alternativă este crearea unei metode HTML externe helper, care este exprimată ca o metodă de extensie C #. Metodele externe auxiliare pot fi folosite mai mult, însă sunt oarecum incomode pentru a scrie, pentru că C # nu suportă generarea elegantă de elemente HTML. Pentru a demonstra acest instrument, folderul Infrastructure este adăugat la proba de proiect, care conține un nou fișier de clasă numit CustomHelpers.cs:

Metoda helper creată aici execută aceeași funcție ca metoda helper încorporată din exemplul anterior - devine o serie de șiruri de caractere și generează un element HTML

    , conținând un element
  • pentru fiecare rând din matrice.







    Primul parametru al metodei HTML helper extern este obiectul HtmlHelper. precedat de acest cuvânt cheie pentru a spune compilatorului C # că este definită metoda extensiei C #. Obiectul HtmlHelper oferă acces la informații care pot fi utile la crearea conținutului, prin proprietățile descrise în tabelul de mai jos:

    Proprietăți utile definite în clasa HtmlHelper

    Returnează o instanță a implementării IView din care a fost apelată metoda helper

    Informațiile care pot fi obținute cu privire la solicitare sunt destul de extinse, însă, în cea mai mare parte, metodele de susținere sunt simple și sunt utilizate pentru a asigura o formatare consistentă. Puteți utiliza metodele încorporate în helper pentru generarea de cereri specifice de conținut (aceste metode vor fi discutate în articolul următor) și reprezentări parțiale sau afiliații de acțiune pentru a rezolva probleme mai complexe.

    O nouă instanță a TagBuilder este creată cu un constructor transferat constructorului ca parametru pentru numele elementului HTML. Când folosiți clasa TagBuilder, brațele de unghiuri (<и>) nu trebuie să specificați, adică element

      , de exemplu, pot fi create după cum urmează:

      Membrii cei mai folositori ai clasei TagBuilder sunt descriși în tabelul de mai jos:

      Metode utile și proprietăți definite în clasa TagBuilder

      Metodă sau proprietate

      O proprietate care vă permite să setați conținutul unui element la un șir HTML. Valoarea specificată pentru această proprietate nu va fi codificată; Cu această proprietate, elementele HTML pot fi încorporate între ele

      Setează conținutul text al elementului HTML. Parametrul șir este codificat pentru a face conținutul sigur pentru afișare

      MergeAttribute (șir, șir, bool)

      Adaugă un atribut elementului HTML. Primul parametru este numele atributului, iar al doilea este valoarea sa. Parametrul bool specifică dacă un atribut cu același nume trebuie înlocuit

      Rezultatul metodei HTML auxiliare este obiectul MvcHtmlString. al căror conținut este scris direct în răspunsul destinat clientului. În exemplul metodei auxiliare, rezultatul apelării metodei TagBuilder.ToString () este transmis constructorului noului obiect MvcHtmlString, după cum se arată mai jos:

      Această instrucțiune generează un fragment de marcare HTML care conține elemente

        și
      • , și îl returnează în motorul de vizualizare pentru introducerea în răspuns.

        Utilizând o metodă auxiliară externă specială

        O metodă externă specială de ajutor este folosită puțin diferit decât metoda încorporată. Exemplul de mai jos arată modificările /Views/Home/Index.cshtml fișier pentru a înlocui încorporat auxiliar extern una metodă:

        Trebuie să ne asigurăm că spațiul de nume care conține metoda de extensie auxiliară este în domeniul de aplicare. Aceasta se face folosind descriptorul @using. dar dacă sunt dezvoltate multe metode speciale de ajutor, este logic să adăugați spațiile lor de nume care le conțin în fișierul /Views/Web.config astfel încât să fie întotdeauna disponibile în vizualizări.

        Datele sunt transmise metoda helper ca și în cazul în care au fost încorporate metode sau C #, deși trebuie avut grijă pentru a alinia proprietățile dinamice ale obiectului de tip ViewBag definit metoda auxiliară externă, care în acest caz este șirul matrice. Sintaxa nu este la fel de elegant ca folosi metode ajutătoare încorporate, dar aceasta este o parte din prețul pe care trebuie să plătească pentru oportunitatea de a crea o metodă de ajutor, care să permită utilizarea în orice vizualizare a proiectului.

        Când trebuie să folosesc metode auxiliare?

        Acum, când știm cum funcționează metodele auxiliare, apare o întrebare destul de rezonabilă: când ar trebui să fie folosite în loc de opiniile parțiale sau de acțiunile copilului, mai ales că funcționalitatea pe care o sprijină se suprapune?

        Utilizez metode auxiliare numai pentru a reduce cantitatea de cod duplicat și marcare în vizualizări, așa cum sa procedat în exemplul de mai sus și numai pentru cel mai simplu conținut. Pentru un marcaj și un conținut mai complex, folosesc reprezentări parțiale și, dacă este necesar să efectuați orice manipulare cu datele modelului, atunci acțiunile copilului. Vă recomandăm să urmați aceeași abordare și să încercați să păstrați metodele auxiliare cât mai simple posibil. (Dacă metodele mele de ajutor conțin mai mult de cinci instrucțiuni C # sau mai mulți operatori C # decât elemente HTML, atunci prefer preferințele parțiale.)

        Gestionarea codificării șirurilor în metoda auxiliară

        Infrastructura ASP.NET MVC Framework oferă protecție împotriva datelor periculoase, codificându-le în mod automat astfel încât acestea să poată fi adăugate în siguranță în pagina HTML. Un exemplu de astfel de codificare poate fi văzut în controlerul de la domiciliu al aplicației în cauză, unde un șir potențial nefiabil este trecut ca un obiect model:

        Acest obiect model conține un element HTML valid, dar când valoarea este redată de Razor, se produce următoarea marcaj HTML:

        Demonstrarea problemei

        Pentru a demonstra problema, clasa Customer Helper a creat o nouă metodă de ajutor, după cum se arată în exemplul de mai jos:

        Această metodă de ajutor folosește un șir ca parametru și generează același marcaj HTML care este inclus în vizualizarea Index. Utilizarea String.Format () metoda este generată HTML fantă care este trecut ca argument la MvcHtmlString constructor. Exemplul următor prezintă schimbările în reprezentarea /View/Home/Index.cshtml de a utiliza noua metodă auxiliară (în plus, de asemenea, se face o schimbare pentru a extrage conținutul, care primește de la această metodă auxiliară):

        Dacă rulați aplicația, puteți vedea rezultatul noii metode auxiliare:

        Mvc 5, metode speciale de ajutor

        Metoda auxiliară este de încredere pentru a genera conținut securizat, ceea ce, din nefericire, determină browserul să afișeze elementul , iar acest comportament poate fi folosit de către atacatori pentru a perturba aplicația.

        Codificarea conținutului metodei auxiliare

        Există câteva moduri în care puteți rezolva această problemă, iar alegerea uneia dintre ele depinde de natura conținutului generat de metoda auxiliară. Soluția cea mai simplă implică schimbarea tipului de returnare a metodei ajutor la șir, așa cum se arată în exemplul de mai jos. Acest lucru previne mecanismul de vizualizare că conținutul nu este securizat și trebuie codificat înainte de adăugarea la vizualizare:

        Această metodă conduce la faptul că Razor va codifica tot conținutul returnat prin metoda secundară, provocând o problemă într-o situație în care a generat-elemente HTML (în acest exemplu), dar fiind foarte convenabil în alte cazuri. Rezultatul poate fi văzut în imagine:

        Mvc 5, metode speciale de ajutor

        Problemă cu elementul rezolvate, dar elementele

        De asemenea, acestea au fost codificate, ceea ce este complet inadecvat. În astfel de situații, este necesară o selectivitate mai mare pentru a codifica numai valorile datelor. Următorul exemplu arată cum se face acest lucru:

        Clasa HtmlHelper definește o metodă de instanță numită Encode (). care rezolvă problema și codifică valoarea șirului astfel încât să poată fi inclusă în siguranță în vizualizare. Problema cu această tehnică este că trebuie să vă amintiți să o aplicați. Toate valorile datelor sunt codate explicit la începutul metodei ca o reamintire și această abordare este mai preferabilă.

        Rezultatul modificării descrise este prezentat în figură:

        Mvc 5, metode speciale de ajutor

        Se poate observa că conținutul generat de o metodă externă de ajutor coincide cu conținutul generat prin utilizarea valorii modelului direct în vizualizare.







        Articole similare

        Trimiteți-le prietenilor: