Im Rahmen unseres Entwicklungs-Mandats für einen mittelständisches Systemhaus mit eigenem Webshop-Produkt, haben wir uns intensiv mit dem repeater-Control von ASP.net beschäftigen dürfen.
Die Herausforderung bestand in einem geschachtelten Repeater. Das klassische Problem lautete: Angebote mit den jeweiligen Angebotspositionen darzustellen. Dazu haben wir die XML-Funktion von T-SQL (SQL Server) genutzt. Die notwendigen Positionsdaten werden als Spalte in dem Angebot, formatiert als RAW-XML, aus der Datenbank geholt:
SELECT OfferPos_P.s_PosNo OfferPos_PosNo, OfferPos_P.s_ItemDesc1 OfferPos_ItemDesc1, OfferPos_P.N_PACKQUANTITY OfferPos_PackQuantity FROM sao.OFFERPOS_P with (Nolock) WHERE OFFERPOS_P.dt_deleted IS NULL AND OFFERPOS_P.I_OFFER_P = @nOfferID FOR XML RAW
Innerhalb des 1. Repeater beinhaltet dann diese Spalte die passenden Positions-Daten. Dieses XML wird dann mit einer kleinen Funktion in eine IEnumerable-Datasource umgewandelt:
public IEnumerable<offerPos> CreateOfferPosDataSource(object xmlData) { XDocument doc = XDocument.Parse($"<?xml version=\"1.0\"?>{xmlData.ToString()}"); IEnumerable<offerPos> result = from c in doc.Descendants("row") select new offerPos() { posNo = (string)c.Attribute("OfferPos_PosNo").Value, itemDesc1 = (string)c.Attribute("OfferPos_ItemDesc1").Value, packQuantity = (decimal)c.Attribute("OfferPos_PackQuantity") }; return result; }
Am Ende kann dann diese Datasource für den zweiten Repeater genutzt werden.
<asp:Repeater runat="server" DataSource='<%# CreateOfferPosDataSource(Eval("offerpos_xml")) %>'> <ul> <ItemTemplate> <li><%# Eval("posNo") %>: <%# Eval("itemDesc1") %></li> </ul> </ItemTemplate> </asp:Repeater>
Cool oder?