Verschachtelte Listen und ASP.NET Webforms Modelbinding

Irgendwie habe ich Blut geleckt. Je mehr ich lerne, desto mehr Spass habe ich dabei. Ziel ist es ASP.NET Listen Controls zu verschachteln um eine Master Detail Ansicht zu haben.

Vorab noch der Hinweis, das dies grundsätzlich eine gefährliche Sache ist. Verschachtelte Daten können sehr schnell umfangreich werden auch wenn das bei der Entwicklung nicht absehbar war.

In meinem Beispiel handelt es sich  um Rechnungen und deren Rechnungspositionen. Eine klassische 1:n Beziehung, allerdings mit in der Praxis meist 1:1 Relation. Es gibt in der Datenbank praktisch nie über 5 Positionen, als Child Datensätze. Das ORM wird mit einem aus einer SQL Server Datenbank generierten Entity Model erzeugt.

image

Die Daten werden per SelectMethod eines ASP.NET Listview Controls geladen.

   1:  Public Function RechnungenList_GetData(<FriendlyUrlSegments(0)> search As Integer)
As IQueryable(Of Rechnungen)
   2:          Dim query = From x In db.Rechnungen
   3:                       Where x.kundenr = search
   4:                       Order By x.Datum Descending
   5:                       Select x
   6:          Return query
   7:      End Function

Ein erster Test im Itemtemplate zeigt, das auch ein Count() auf dem Objekt Rechnungen.Rechnungsposten funktioniert. Das stimmt optimistisch, das diese Liste auch an das DataSource Attribut einer verschachtelten Liste binden lässt. Dafür kommt ein Repeater, Gridview oder auch ein Listview in Frage.

   1:  <asp:ListView EnableViewState="False"
   2:    ItemType="Rechnungen"
   3:    ID="RechnungenList" runat="server"
   4:    SelectMethod="RechnungenList_GetData"
   5:    AutoGenerateColumns="False">
   6:   <ItemTemplate>
   7:      <li>
   8:       <h4 class="list-group-item-heading">
   9:           <%# Item.Datum.Value.ToShortDateString%>
  10:           <%#Item.Rechnungsbetrag.Value.ToString("c")%> 
  11:       </h4>
  12:      <p>
  13:      <div >
  14:      <asp:ListView runat="server" ID="posten"
  15:           ItemType="Rechnungsposten"
  16:           DataSource="<%#Item.Rechnungsposten%>">
  17:           <ItemTemplate>
  18:             <div>
  19:                <%#Item.anzahl%> <%#Item.Bezeichnung %>
  20:             </div>
  21:           </ItemTemplate>
  22:      </asp:ListView>
  23:      </div>
  24:      </p>
  25:    </li>
  26:   </ItemTemplate>
  27:  </asp:ListView>

Aus dem HTML bzw. ASP.NET Code Beispiel ist noch erwähnenswert, der Typ Converter beim Model Binding über die Item Value Eigenschaft. Zum einem ein Datum bzw. Date und einmal eine Währung bzw. Currency.

Unter Anwendung von Bootstrap Design Attributen formatiert, sieht die geschachtelte Liste dann so aus

image

Pingbacks and trackbacks (1)+

Kommentare sind geschlossen