ASP.NET-ben listás adatok megjelenítésére bevett gyakorlat valamilyen adatmegjelenítő vézerlőhöz (Repeater, DataList, GridView, ListView, stb.) történő kötés. A dolog az ASP.NET 2.0 óta különösen egyszerű. A vezérlő DataSource tulajdonságának megadjuk a kötendő adatok listáját (valamilyen IEnumerable interfészű tárolót, például Osztaly[]), a vezérlőhöz tartozó megjelenítő sablonban pedig <%# Eval( "Tulajdonsag" ) %> bejegyzéssel jelöljük, hogy ezen a helyen a kötött adat aktuális példányának (például az osztaly[ i ]-nek) A "Tulajdonsag" nevű tulajdonsága legyen (ez esetben: osztaly[ i ].Tulajdonsag).
Az első problémával akkor szembesül az ember, amikor az adatforrás olyan típusokat tartalmaz, melyeknek nincsen semmilyen tulajdonságuk. A string[] példánál maradva: mit írhat az ember az <%# Eval( "NA_IDE_MI_JON" ) %> részbe? Ilyenkor két lehetőségünk van:
- Burkolóosztályt készítünk a kötendő osztályhoz: például csinálunk egy MyString osztályt, ami egyetlen stringet tartalmaz (ez a tényleges adat), és van egy "TheString" nevű propertyje. Ekkor a vezérlő adatforrásául megadható a MyString[], az eval részbe pedig ez írható: <%# Eval( "TheString" ) %>. Ez a módszer kicsit ágyúval-verébre, de működik.
- Tudjuk, hogy a <%# %> részbe más is írható, nem csak Eval(), Bind(), XPath() és hasonlók, hanem bármi a jóízlés határain belül. Például az, hogy Container.DataItem. Ez egyébként a kötött felsorolt típus épp aktuális elemét jelenti. A string[] példánál maradva épp az aktuális sztringet. Ráadásul a <%# %> közé bármilyen metódushívás is elhelyezhető (akár a kötött adaton, akár csak úgy, például egy random szám generálása). Ebből már elég jól lehet kombinálni.
Végül álljon itt a legegyszerűbb példa: string[] kötése és megjelenítése Repeaterben:
<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
protected void btnOK_Click( object sender, EventArgs e )
{
this.repeater.DataBind();
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<asp:Repeater ID="repeater" runat="server" DataSource='<%# this.txtSzoveg.Text.Split() %>'>
<ItemTemplate> '<%# Container.DataItem %>' </ItemTemplate>
<SeparatorTemplate> - </SeparatorTemplate>
</asp:Repeater>
<br />
<asp:TextBox ID="txtSzoveg" runat="server" TextMode="MultiLine" Height="300px" Width="400px" />
<br />
<asp:Button ID="btnOK" runat="server" Text="OK" OnClick="btnOK_Click" />
</form>
</body>
</html>
Az oldalon van egy szövegdoboz (txtSzoveg), egy gomb (btnOK) és egy Repeater (repeater). Beírok valamit a szövegdobozba, megnyomom a gombot és a repeater DataSource propertyjéhez hozzákötődik a szövegdoboz szövegének szóközönként feltördelt sztring-tömbje. Ezután a megjelenítő sablonban a '<%# Container.DataItem %>' rész idézőjelek között megjeleníti az épp aktuális sztringet. A <SeparatorTemplate> - </SeparatorTemplate> rész pedig mínusz jellel választja el őket egymástól.