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" .