ASP.NET Webforms Model Binding List of String

Eigentlich sollte es eine ganz einfach Bilderliste sein. Einfügen per Drag& Drop und löschen per Checkbox. Aus unerklärlichen Gründen wollte ich keine generische Liste von komplexen Objekten verwenden, sondern einfach Zeichenketten. Es ist ja nur eine Liste von Bildernamen.

image

Das klappt auch ganz klasse per Modelbinding. Eine List(of String) wird per SelectMethod Rückgabe Parameter akzeptiert. Das Attribut ItemType erhält System.String als Wert und Binding geht rein auf Item. Das Problem liegt in den Datakeys, die man benötigt um die selektierten Dateien beim klick auf den Löschen Button herauszufinden.  Das Attribut DataKeyNames des Webforms Listview Controls benötigt ein Property als Parameter. Das einzige Property von String ist Length.

Der nächste Gedanke ist, eine Extension Method zu schreiben. Die ist aber nicht Bindbar und Extension Propertys sind (noch) nicht verfügbar. Weder in C# noch VB.NET.

Es wäre so einfach, Class irgendwas, ein Property vom Typ String und fertig. Aber ich bin hartnäckig. So entstand der Gedanke eine andere Liste mit Key und Value Property zu nehmen.

   1:  <asp:ListView ID="Listview1" runat="server"
   2:           ItemType="System.Collections.Generic.
KeyValuePair`2[System.String, System.String]"
   3:           DataKeyNames="Key"
   4:           SelectMethod="Repeater1_GetData">
   5:          <ItemTemplate>
   6:           <div class="col-lg-3 col-md-4 col-xs-6 thumb">
   7:                 <div class="thumbnail">
   8:                       <img class="img-responsive" 
src="/bilder/<%# Item.Value %>" alt="">
   9:                          <div class="checkbox"
  10:                                       style="position: absolute; top: 5px; left: 25px">
  11:                                      <asp:CheckBox 
  12:                                          ID="wahl"
  13:                                          runat="server" />
  14:                           </div>
  15:                  </div>
  16:            </div>
  17:       </ItemTemplate>
  18:  </asp:ListView>

 

Gefüllt wrd die Liste mit dem Inhalt eines Verzeichnisses

   1:  Public Function Repeater1_GetData() As System.Collections.IEnumerable
   2:         bilder = New List(Of KeyValuePair(Of String, String))
   3:          Dim oFS As New DirectoryInfo(Server.MapPath("bilder"))
   4:          For Each datei In oFS.GetFiles("*.jpg")
   5:              bilder.Add
(New KeyValuePair(Of String, String)(datei.Name, datei.Name))
   6:          Next
   7:          Return bilder
   8:  End Function

Damit ist das Ziel erreicht, eine List Of String an eine ASP.NET Listview per Modelbinding zu binden. Nur der Vollständigkeit auch noch der VB.NET Code zum auswerten der Mulitselect Checkbox List.

   1:  Protected Sub delete_Click(sender As Object, e As EventArgs)
   2:          Dim success As Boolean = False
   3:          For i = 0 To Listview1.Items.Count - 1
   4:              If CType(Listview1.Items(i).
FindControl("wahl"), CheckBox).Checked() Then
   5:                  Dim datei = Listview1.DataKeys(i).Value.ToString
   6:                  File.Delete(Server.MapPath("~\bilder\" + datei))
   7:              End If
   8:          Next
   9:  End Sub
Kommentare sind geschlossen