Ich habe eine einfache Seite, die Kontakte nachschlägt, die einen Webservice mit einer einzigen Methode verwenden, die in Linq geschrieben wird. Auf der Seite habe ich sowohl eine Gridview als auch eine Listview mit einem DataPager, um die beiden zu vergleichen. Ich kann Paging gut mit der Gridview arbeiten, aber der Linq-Code muss alle Daten bei jedem Aufruf zurückgeben und lassen Sie die Web-Seite nur eine Seite Wert auswählen ... nicht die beste Lösung.Paging funktioniert nicht mit ListView und Webservice mit Linq
Mir wurde gesagt, dass ein ListView dieses Problem lösen wird, aber alle Beispiele, die ich finden konnte, haben den Linq-Code auf der Webseite statt in einer separaten Schicht (z.B. einem Webservice). Im Idealfall sollte ich dem Webdienst mitteilen können, dass er eine bestimmte Seite mit Daten zurückbringt (Startnummer und Anzahl der Zeilen), aber wie bekomme ich den ListView (oder den DataPager), um ein Event auszulösen, das danach fragt Daten?
Hier ist der ASPX Code:
<asp:ListView ID="listPersons" runat="server">
<LayoutTemplate>
<table>
<thead>
<tr>
<th>
Site ID
</th>
<th>
PersonID
</th>
<th>
Person Name
</th>
</thead>
<tbody>
<asp:PlaceHolder ID="itemPlaceholder" runat="server" />
</tbody>
</table>
<asp:DataPager ID="Pager1" runat="server" PagedControlID="listPersons" PageSize="5" >
<Fields>
<asp:NextPreviousPagerField ShowFirstPageButton="true" ShowPreviousPageButton="true"
ShowNextPageButton="false" ShowLastPageButton="false" />
<asp:NumericPagerField />
<asp:NextPreviousPagerField ShowFirstPageButton="false" ShowPreviousPageButton="false"
ShowNextPageButton="true" ShowLastPageButton="true" />
</Fields>
</asp:DataPager>
</LayoutTemplate>
<ItemTemplate>
<tr>
<td>
<%# Eval("SiteID") %>
</td>
<td>
<%# Eval("PersonID") %>
</td>
<td>
<%# Eval("PersonName") %>
</td>
</tr>
</ItemTemplate>
<EmptyDataTemplate>
No data found...
</EmptyDataTemplate>
</asp:ListView>
Hier ist der Code hinter:
private void DoList(string Match)
{
ContactsService cs = new ContactsService();
listPersons.DataSource = cs.Find(Match, 100);
listPersons.DataBind();
}
und die Bahn serivice:
[WebMethod]
public List<Person>Find(string Match, int Count)
{
if (Count < 5) Count = 5;
using (DataLayer.ContactsDataContext context = new ContactsDataContext())
{
var Persons =
from p in context.Persons
where p.PersonName.Contains(Match)
orderby p.LastName, p.FirstName
select new Person()
{
SiteID = p.SiteID,
PersonID = p.PersonID,
PersonName = p.PersonName,
};
return Persons.Take(Count).ToList();
}
}
Das Problem bei der Verwendung von ODS und LDS auf der Webseite besteht darin, dass es das architektonische Ziel einer mehrstufigen Architektur verletzt. Ich möchte eine Business-Schicht in LINQ, die von jedem Front-End aufgerufen werden kann. Der Web-Service ist ein Beispiel für eine Business-Schicht. Ich könnte ebenso einfach eine Business-Schicht in einer DLL erstellen, die von der Benutzerschicht aufgerufen wurde. Beide Lösungen haben das Problem, das ich hier anwende. –