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.