I nya ASP.NET 4.5 går det att använda typade repeaters (video):
(Fungerar i klassiska ASP.NET också, men då får man hacka ganska mycket först).
Tyvärr har man ofta inte möjlighet att köra nya ASP.NET 4.5 med typade repeaters. Och man hinner inte heller använda hacket ovan, vilket medför att man är fast med att använda den tråkiga och *farliga DataBinder.Eval:
* = Du får inget kompileringsfel om du råkar skriva "FullNme" istället för "FullName" och du kan inte trycka F9 / "go to definition" om du vill navigera till den aktuella metoden/propertyn.
Skapade därför en enkel hjälpklass för att nästan uppnå samma sak som en typad repeater. Denna klass fungerar som en wrapper för det objektet man vill arbeta med i sin repeater.
Notera även att ToString()-metoden returnerar en tomsträng. Kommer förklara varför längre ner.
Klassen RepeaterItem kan användas på följande sätt:
PersonListView.aspx.cs - "codebehind"
Fördelen med att använda denna hjälpklass är:
- Man slipper oväntade runtime-fel pga felstavning
- Intellisense i aspx-filen
- Möjlighet att direkt använda "go to definition"
- Renare och mer överblickbar kod
PersonListView.aspx med hjälpklassen RepeaterItem:
Snyggare och mindre risk för felstavningar!
Har använt denna lösning i tidigare projekt, och det har fungerat mycket väl.
Dock kan man ju tycka att man borde kunna skriva nåt sådant här också:
<% Item = (Person)Container.DataItem %>
Och då få samma resultat utan en extra klass.
Dock har man inte tillgång till Container.DataItem utan att använda "databind taggarna" <%# %> med (#).
Skulle man istället skriva:
<%# Item = (Person)Container.DataItem %>
Hade outputen blivit något i stil med:
Labs.Project.Views.Person
Nils, Jönköping
Labs.Project.Views.Person
Karl, Stockholm
Som ni ser, får man även med: Labs.Project.Views.Person (outputen av ToString vid tilldelningen av Item) eftersom <%# databind taggen %> anropar ToString på objektet.
Av den anledningen görs en override av ToString i RepeaterItem.cs som endast returnerar string.Empty.
/Nils