Ich verwende CSLA.NET, um an einem Webprojekt zu arbeiten, und habe festgestellt, dass das CSLA-Modell für die nationalen Bedingungen Chinas bei der Entwicklung des Webs nicht sehr geeignet ist.
Seine Vorlagenserie basiert alle auf der Berücksichtigung von Master-Detail-Formularen, wie z. B. „Purchase Order“, das über eine einzige Kopfzeile und Detailzeilen verfügt, was unter WinForm großartig ist.
Aber im Web werden die meisten Objekte über ein separates Formular bearbeitet, daher ist es etwas umständlich.
Mein Verständnis ist noch nicht tief und ich lerne immer noch. Das ganze Framework hat mir sehr geholfen. Genug Unsinn, kommen wir zur Sache.
Um Sql2005-Paging bequem im CSLA-Modell verwenden zu können, müssen wir vier Schritte ausführen.
Schritt 1: Implementieren Sie ein PagingCriteria, um Paging-Parameter zu übergeben.
[Serialisierbar()]
öffentliche Klasse PagingCriteria<T>: CriteriaBase
{
#region Abgelegt
public IDictionary ParamDic { get; private set;
öffentliche Zeichenfolge SortExpression { get; private set;
public string DefaultOrder { get; private set;
public int StartRowIndex { get; private set;
public int MaximumRows { get; private set;
#endregion
protectedPagingCriteria(){ }
public PagingCriteria(IDictionary paramDic, int startRowIndex, int maximumRows, string sortExpression, string defaultOrder)
: base(typeof(T))
{
ParamDic = paramDic;
SortExpression = sortExpression;
DefaultOrder = defaultOrder;
StartRowIndex = startRowIndex;
MaximumRows = MaximumRows;
}
}
Schritt 2: Implementieren Sie PagingWrapper, um gewöhnliche SQL-Anweisungen in Paging-Anweisungen zu kapseln.
öffentliche statische Klasse PagingWrapper
{
private const string SQLTEMPLATE = @"With TargetTable AS(select ROW_NUMBER() OVER (order by Temp.{1})as RowNumber,Temp.* from ({0}) as Temp) select * from TargetTable WHERE RowNumber between {2} und {3};Wählen Sie count(*) aus ({0}) Temp aus";
öffentlicher statischer String Wrap(string sqlQuery, string SortExpression, int startRowIndex, int maximumRows)
{
if (string.IsNullOrEmpty(SortExpression))
throw new Exception("Keine Sortierspalte angegeben.");
return string.Format(SQLTEMPLATE, sqlQuery, SortExpression, startRowIndex +1, startRowIndex + maximumRows);
}
öffentliche statische Zeichenfolge Wrap<T>(Zeichenfolge sqlQuery, PagingCriteria<T>-Kriterien)
{
string order = (string.IsNullOrEmpty(criteria.SortExpression)) ? Kriterien.DefaultOrder : Kriterien.SortExpression;
return Wrap(sqlQuery, order, Kriterien.StartRowIndex, Kriterien.MaximumRows);
}
}
Teil 3: Im Sammlungsobjekt aufgerufen. Hier ist RoleList.
mit (SqlCommand cm = cn.CreateCommand())
{
cm.CommandType = CommandType.Text;
string sql = "SELECT * FROM Roles";
cm.CommandText = PagingWrapper.Wrap(sql, Kriterien);
using (SafeDataReader dr = new SafeDataReader(cm.ExecuteReader()))
{
while (dr.Read())
Add(Role.FillRole(dr));
dr.NextResult();
dr.Read();
TotalRowCount = dr.GetInt32(0);
}
}CommandText wird durch den Aufruf von Wrapper zurückgegeben. Die TotalRowCount-Eigenschaft ist die Implementierung der Csla.Core.IReportTotalRowCount-Schnittstelle.
Schritt 4: Datenquellensteuerung auf der Seite verwenden, Gridview binden und Paging implementieren:
private int totalCount = 0;
protected void CslaDs_SelectObject(object sender, Csla.Web.SelectObjectArgs e)
{
BLL.Security.RoleList list = BLL.Security.RoleList.PagingRoleList(null, e.SortExpression, e.StartRowIndex, e.MaximumRows);
e.BusinessObject = Liste;
totalCount = list.TotalRowCount;
}
protected void gvlist_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.Pager)
{
((Label)e.Row.FindControl("lblTotal")).Text = totalCount.ToString();
}
}public static RoleList PagingRoleList(IDictionary paramDic, string SortExpression, int startRowIndex, int maximumRows)
{
return DataPortal.Fetch<RoleList>(new PagingCriteria<RoleList>(paramDic, startRowIndex, maximumRows, SortExpression, "ID"));
}Seitenrasteransicht-Paginierungsteil:
<PagerTemplate>
<br />
Gesamtzahl der <asp:Label ID="lblTotal" runat="server" ></asp:Label> Zeilen
<asp:Label ID="lblPage" runat="server" Text='<%# "Seite" + (((GridView)Container.NamingContainer).PageIndex + 1) + "Seiten/Gesamt" + (((GridView) Container.NamingContainer).PageCount) + "page" %> '></asp:Label>
<asp:LinkButton ID="lbnFirst" runat="Server" Text="Home" Enabled='<%# ((GridView)Container.NamingContainer).PageIndex != 0 %>'
CommandName="Seite" CommandArgument="First"></asp:LinkButton>
<asp:LinkButton ID="lbnPrev" runat="server" Text="Vorherige Seite" Enabled='<%# ((GridView)Container.NamingContainer).PageIndex != 0 %>'
CommandName="Seite" CommandArgument="Prev"></asp:LinkButton>
<asp:LinkButton ID="lbnNext" runat="Server" Text="Next Page" Enabled='<%# ((GridView)Container.NamingContainer).PageIndex != (((GridView)Container.NamingContainer).PageCount - 1) %>'
CommandName="Seite" CommandArgument="Weiter"></asp:LinkButton>
<asp:LinkButton ID="lbnLast" runat="Server" Text="Letzte Seite" Enabled='<%# ((GridView)Container.NamingContainer).PageIndex != (((GridView)Container.NamingContainer).PageCount - 1) %>'
CommandName="Seite" CommandArgument="Last"></asp:LinkButton>
<br />
</PagerTemplate> Hier sollte erklärt werden, dass die Gesamtzahl der Zeilen über die Eigenschaft list.TotalRowCount ermittelt wird. Daher muss RoleList die Schnittstelle Csla.Core.IReportTotalRowCount implementieren.
Sie fragen sich vielleicht, warum Sie die Gesamtzahl der Zeilen nicht direkt in Gridview und PagerTemplate schreiben. Dies liegt tatsächlich daran, dass Gridview diese Eigenschaft, das System.Web.UI.DataSourceSelectArguments-Objekt, nicht verfügbar macht.
Nach dem Abrufen der Daten wird die Gesamtzahl der Zeilen an das Innere der Gridview zurückgegeben, aber die Gridview erstellt eine lokale PagedDataSourse in einer privaten Methode und zeichnet die Gesamtzahl der Zeilen darin auf. Sie kann weder extern noch über sie abgerufen werden Spiegelung.
Der einfachste Weg besteht also darin, es zuerst aufzuschreiben und es dann in das RowDataBound-Ereignis zu schreiben. Wenn Sie Perfektion benötigen, können Sie eine Gridview selbst kapseln, die TotalRowCount-Eigenschaft hinzufügen und sie verfügbar machen.