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


  • Run ablak Windows Mobile-on

    Balássy György (MS RD, ASP.NET MVP, MCTS) Nem éppen gyakori kérdés, de azért újra és újra belefut az ember, hogy hogyan lehet Windows Mobile-on egy parancssort, vagy legalább egy Run ablakot előhúzni. Íme egy trükk: tartsuk nyomva az Action gombot és közben tappintsunk sokáig a címsorban az óra helyére. Az Analog/Digital menü helyett ez jelenik meg. Tovább »
  • System Center Remote Hacking Edition

    Balássy György (MS RD, ASP.NET MVP, MCTS) A tegnapi System Center konferencia után jutott eszembe, hogy van egy csuda egyszerű módja annak, hogy az ember távoli rendszerfelügyeleti szoftverre tegyen szert, ráadásul teljesen ingyen! Sőt, a szoftverhez még egy távoli rendszergazda is jár, ő is szinte ingyen! Mindössze egy egyszerű weblapot kell készítenünk. 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