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: ,


  • Beágyazott operációs rendszerek, 0. nap (Ismerkedés)

    Kővári Bence Visszagondolva, hosszú években mérhető, hogy mikor nyúltam utoljára olyan géphez, amelyben csak egy processzormag, vagy éppen gigabájtokban nem mérhető mennyiségű RAM volt. Most mégis megtörtént, egy régóta dédelgetett hobbiprojektemnek hála. A következő pár napban bemutatom, miként sikerül (vagy éppen nem sikerül) életet lehelnem egy – mai szemmel nézve – buta kis számítógépbe. Hangsúlyoznám, hogy egyelőre semmilyen tapasztalatom nincsen ezen a téren, szóval előre is elnézést azoktól, akiket az időnként naív próbálkozásaim untatnának. Tovább »
  • UpdatePanel - akkor hogy is van ez?

    Biztos sokan láttatok már ilyen-olyan tutorial videókat, mint például ez is, ami az ASP.NET alkalmazások AJAXosítása kapcsán mindösszesen arról szól, hogy tegyünk bele mindent UpdatePanel-be, és készen is vagyunk. Kétségtelenül egyszerű, kétségtelenül működik is, de vajon tényleg ez a legjobb megoldás? 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