ASP.NET Modelbinding selectmethod wird nicht ausgelöst bei POST

Gestern hatte ich eine Diskussion, wie geil Caching sein kann. Cache gibt es an vielen Stellen, Datenbank, HTML Rendering, Client und auch der Viewstate ist eine Art Cache.

Mein Problem war: beim modernen ASP.NET Webforms Modelbinding löst ein Buttonclick nicht die SelectMethod aus. Beim initalen Page Load klappt es, aber dann nicht mehr. Klugerweise habe ich das sogar mal im MSDN Forum gepostet und musste dann mit sinnfreien Antworten kämpfen.

Zur Erklärung der Code mit SQL Kommandos statt Entity Framework Model.

   1:      Public Function ListView1_GetData() As IQueryable(Of plzdistance.nearbyme)
   2:          Dim l As New List(Of nearbyme)
   3:          Dim sql = "DECLARE @g geography ;
   4:  Select @g = temp from plzgeo where plz=@plz;
   5:  Select  top(3)  plz, ort,location.STDistance(@g)  FROM ppedvgeo
   6:  WHERE location.STDistance(@g) Is Not NULL
   7:  ORDER BY location.STDistance(@g);"
   8:          Dim con As SqlConnection
   9:          con = New SqlConnection(ConfigurationManager.ConnectionStrings("connection1").ConnectionString)
  10:          con.Open()
  11:          Dim cmd = New SqlCommand(sql, con)
  12:          cmd.Parameters.AddWithValue("@plz", TextBox1.Text)
  13:   
  14:          Try
  15:              Dim rd = cmd.ExecuteReader()
  16:              While rd.Read
  17:                  l.Add(New nearbyme With {.plz = rd("plz"), .ort = rd("ort"), .distanz = rd(2)})
  18:              End While
  19:   
  20:   
  21:          Catch
  22:          End Try
  23:          Return l.AsQueryable
  24:      End Function

Und im ASPX Code der deklarative Teil des Webforms Modelbinding.

   1:    <asp:TextBox ID="TextBox1" runat="server" Text="84489"></asp:TextBox>
   2:          <asp:Button ID="Button1" runat="server" Text="Button" />
   3:          <a href="#" onclick="myloc();">erkennen</a>
   4:          <br />
   5:          <br />
   6:          <asp:ListView ID="ListView1" runat="server" 
   7:              SelectMethod="ListView1_GetData"
   8:              ItemType="plzdistance.nearbyme">
   9:              <ItemTemplate>-
  10:                  <%#Item.plz %> 
  11:                  <%#Item.ort %>
  12:              </ItemTemplate>
  13:          </asp:ListView>

Der ganze Clou ist, das ASP.NET den Status der Liste aus dem Viewstate wiederherstellt, wenn dieser gefüllt ist. Einfacher Workaround in der @Page Direktive EnableViewState="false" .

Kommentare sind geschlossen