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


  • Hogyan toljunk ki másokkal?

    Balássy György (MS RD, ASP.NET MVP, MCTS) Íme a legújabb tipp arra, hogyan toljunk ki felebarátainkkal: küldjük neki az anyagainkat XPS formátumban ÉS adjunk a fájlnak ékezetes fájlnevet. Míg egy ékezet nélküi fájlt simán megnyitott nálam Vista alatt az IE-be integrálódó XPS viewer, addig egy á.xps vagy egy é.xps fájl így nyílt meg. Tovább »
  • Linkblog: ASP.NET Menu IE8 alatt

    Balássy György (MS RD, ASP.NET MVP, MCTS) Ha a standard ASP.NET Menu vezérlőnek használjuk a dinamikusan kinyíló funkcióit, akkor készüljünk fel rá, hogy a menünk Internet Explorer 8 alatt nem fog helyesen megjelenni. 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