Eval HtmlEncode-dal

Nagyon bosszantó tud lenni, hogy az ASP.NET-es vezérlők közül még a legalapvetőbbek sem végeznek HTML kódolást, így kénytelenek vagyunk ezt mi magunk elvégezni adatkötéskor. Az eredmény egy ismétlődő és nehezen olvasható kifejezés lesz.

Például:

  Text='<%# this.Server.HtmlEncode( Eval( "NewsTitle" ).ToString() ) %>'

A legszebb az lenne, ha az Evalt fel tudnánk váltani egy saját EncodeEval metódusra, amely belül megcsinálja a ToStringet és a HtmlEncode-ot is. Tudva, hogy az Eval belül valójában DataBinder.Eval és bevetve az extension metódusok erejét, meg is lehet csinálni:

  public static string EncodeEval( this Control control, string expression )
  {
    return HttpUtility.HtmlEncode( 
DataBinder.Eval( control.Page.GetDataItem(), expression ).ToString() ); }

Sőt, ha kell a formázás is, akkor írhatunk belőle még egyet:

  public static string EncodeEval( this Control control, string expression, string format )
  {
return HttpUtility.HtmlEncode(
DataBinder.Eval( control.Page.GetDataItem(), expression, format ).ToString() ); }

Így már csak ennyi kerül a markupba:

  Text='<%# this.EncodeEval( "NewsTitle" ) %>'

A dolognak egyetlen apró szépséghibája van: ez belül éppúgy reflectiont használ, mint a hagyományos Eval. Erre akar utalni az MSDN is, csak éppen nagyon félreérthetően teszi a DataBinder.Eval leírásánál:

Because this method performs late-bound evaluation, using reflection at run time, it can cause performance to noticeably slow compared to standard ASP.NET data-binding syntax. Use this method judiciously, particularly when string formatting is not required.

A nagy kérdés persze, hogy hogyan lehet elkerülni a reflectiont? Én azt szoktam csinálni, hogy megnézem, mi van az aktuális rekordban, például így:

  Text='<%# Container.DataItem %>'

ListView esetén például System.Data.DataRowView, amit megindexelhetünk oszlopnévvel:

  Text='<%# ( (System.Data.DataRowView) Container.DataItem )[ "NewsTitle" ] %>'

Ez már nem használ reflectiont, cserébe hosszú és nem is végez HTML kódolást.

Vissza a Start mezőre :)

A teljes implementáció letölthető innen.


txt ControlExtensions.cs.txt (3 kB)


Balássy György (MS RD, ASP.NET MVP, MCTS)

Balássy György (MS RD, ASP.NET MVP, MCTS) Villamosmérnök, a BME Automatizálási és Alkalmazott Informatikai Tanszékén webportálok fejlesztését oktatja. 2000 óta foglalkozik a Microsoft .NET platformjával, melynek meghonosításában jelentős szerepet vállalt előadóként, konzulensként és A .NET Framework és programozása című könyv társszerzőjeként. Az MSDN Kompetencia Központon belül a Portál Technológiák Csoport vezetője, szakterülete web alapú rendszerek fejlesztése és üzemeltetése. 2004-ben Magyarországon elsőként kapta meg a Most Valuable Professional címet, majd 2005 óta a Microsoft magyarországi regionális igazgatója. Publikációi a Technet Magazinban, az MSDN Kompetencia Központ honlapján és szakmai blogjában olvashatóak.

2010.05.31. 11:04:44 | Permalink | Hozzászólások: 0 | Tárgyszavak: ,


  • Word dokumentum generálása adatkötéssel - 5. rész: A kód neve

    Balássy György (MS RD, ASP.NET MVP, MCTS) Az előző részben láttuk, hogyan kapcsolódik a DOCX állományban lévő customXml part kétirányú adatkötéssel a content control vezérlőkhöz. Ha ezzel a módszerrel akarunk programozottan dokumentumot előállítani, akkor már csak egyetlen lépés van hátra: olyan kódot kell írnunk, amely belenyúl az Open XML állományba és felülírja a korábban már odatett XML partot, aminek tartalma azután az adatkötéseken keresztül automatikusan megjelenik a felhasználó számára. Tovább »
  • Kocka büfé

    Dávid Zoltán Itt a nyár. Ennek ürügyén bemutatom másik kedves helyemet: a Kockát, az MSDNK Kompetencia Központ néhány tagjának kedves helyét. A Kocka az egyetem (BME) mellett található, a Magyar Tudósok Körútján (házszáma szerintem nincs). Alapját egy bádog-bódé alkotja, mely köré az idők folyamán jelentős infrastruktúra épült: kinti sörpadok és asztalok, régi székekből készült padok, mellékhelyiség, saját ültetésű bokrok és virágok, esőtetők. Közvetlen közelében teniszpálya és uszoda van, valamint az Infoparkot átszelő kerékpárút mellé épült. Tovább »


Írja meg Ön is véleményét!


Hozzászólásokat csak regisztrált, bejelentkezett felhasználóktól tudunk elfogadni!

Hozzászólások