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


  • Workflow Services .NET 3.5-ben: SendActivity és ReceiveActivity

    Balássy György (MS RD, ASP.NET MVP, MCTS) Ha valaki alaposan körülnéz a .NET Framework 3.5-ben workflow újdonságok után kutatva, aligha talál túl sok mindent. Mindössze két új activity van, a Send és a Receive activity-k, melyek azonban nagyon hasznosak, hiszen a korábban már annyit szidott ExternalDataExchangeService használatát tehetik feleslegessé. Előnyük, hogy a Windows Communication Foundationre épülnek, tehát ha tudunk WCF-ül, akkor nem fog gondot okozni a használatuk és valóban egyszerűbb lesz az életünk, mint az EDES alapú kommunikációval. Ugyanez a hátrányuk is, tudnunk kell WCF-ül, ha használni akarjuk őket, és így már nem csak a WF-hez, de a WCF-hez is értenünk kell; két, önmagában sem kicsi és... Tovább »
  • MySQL telepítése Windows Server 2008 szerverre

    Dávid Zoltán A PHP-alapú webes alkalmazások egyik leggyakoribb partnere a MySQL adatbáziskezelő. Nem kutatjuk sikerének titkát, nem ítélkezünk felette, egyszerűen csak feltelepítjük Windows Server 2008-ra. A videó célja, hogy segítse a MySQL telepítések elvégzését, biztos alapot adva ezzel sorozatunk további részeihez. 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