Saya menggunakan CSLA.NET untuk mengerjakan proyek Web dan menemukan bahwa model CSLA tidak terlalu cocok untuk kondisi nasional Tiongkok ketika mengembangkan Web.
Rangkaian templatnya semuanya didasarkan pada pertimbangan formulir detail utama, seperti "Pesanan Pembelian", yang memiliki satu header dan baris detail, yang sangat bagus di bawah WinForm.
Namun di Web, sebagian besar objek diedit menggunakan formulir terpisah, sehingga terasa agak janggal.
Pemahaman saya belum mendalam, dan saya masih belajar. Keseluruhan kerangka telah memberikan banyak manfaat bagi saya.
Untuk menggunakan paging Sql2005 dengan mudah dalam model CSLA, kita perlu melakukan empat langkah.
Langkah 1: Terapkan PagingCriteria untuk meneruskan parameter paging.
[Dapat diserialkan()]
PagingCriteria kelas publik<T> : Basis Kriteria
{
#wilayah Diarsipkan
ParamDic IDictionary publik { dapatkan;
ekspresi pengurutan string publik { dapatkan; kumpulan pribadi;
string publik DefaultOrder { dapatkan; set pribadi;
public int StartRowIndex { dapatkan; set pribadi;
public int MaximumRows { dapatkan; set pribadi;
#wilayah akhir
kriteriaPaging yang dilindungi(){ }
Kriteria Paging publik (IDictionary paramDic, int startRowIndex, int maksimumRows, string sortExpression, string defaultOrder)
: dasar(tipe(T))
{
ParamDic = paramDic;
SortExpression = sortExpression;
Pesanan Default = Pesanan default;
StartRowIndex = startRowIndex;
Baris Maksimum = Baris Maksimum;
}
}
Langkah 2: Implementasikan PagingWrapper untuk merangkum pernyataan Sql biasa menjadi pernyataan paging.
PagingWrapper kelas statis publik
{
private const string SQLTEMPLATE = @"Dengan TargetTable AS(pilih ROW_NUMBER() OVER (urutkan berdasarkan Temp.{1})sebagai RowNumber,Temp.* dari ({0}) sebagai Temp) pilih * dari TargetTable WHERE RowNumber antara {2} dan {3};Pilih hitungan(*) dari ({0}) Suhu";
bungkus string statis publik (string sqlQuery, string SortExpression, int startRowIndex, int maksimumRows)
{
jika (string.IsNullOrEmpty(SortExpression))
throw new Exception("Tidak ada kolom pengurutan yang ditentukan.");
mengembalikan string.Format(SQLTEMPLATE, sqlQuery, SortExpression, startRowIndex +1, startRowIndex + maksimumRows);
}
string statis publik Bungkus<T>(string sqlQuery, kriteria PagingCriteria<T>)
{
urutan string = (string.IsNullOrEmpty(criteria.SortExpression)) ? kriteria.DefaultOrder : kriteria.SortExpression;
return Wrap(sqlQuery, pesanan, kriteria.StartRowIndex, kriteria.MaximumRows);
}
}
Bagian 3: Dipanggil dalam objek koleksi. Ini adalah RoleList.
menggunakan (SqlCommand cm = cn.CreateCommand())
{
cm.CommandType = CommandType.Teks;
string sql = "PILIH * DARI Peran";
cm.CommandText = PagingWrapper.Wrap(sql, kriteria);
menggunakan (SafeDataReader dr = new SafeDataReader(cm.ExecuteReader()))
{
sementara (dr.Baca())
Tambahkan(Peran.FillRole(dr));
dr.NextResult();
dr.Baca();
TotalRowCount = dr.GetInt32(0);
}
}CommandText dikembalikan dengan memanggil Wrapper. Properti TotalRowCount adalah implementasi antarmuka Csla.Core.IReportTotalRowCount.
Langkah 4: Gunakan kontrol sumber data pada halaman, ikat Gridview dan terapkan paging:
pribadi int totalCount = 0;
dilindungi kekosongan CslaDs_SelectObject(pengirim objek, Csla.Web.SelectObjectArgs e)
{
Daftar BLL.Security.RoleList = BLL.Security.RoleList.PagingRoleList(null, e.SortExpression, e.StartRowIndex, e.MaximumRows);
e.BusinessObject = daftar;
totalCount = daftar.TotalRowCount;
}
dilindungi kekosongan gvlist_RowDataBound(pengirim objek, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.Pager)
{
((Label)e.Row.FindControl("lblTotal")).Teks = totalCount.ToString();
}
}PagingRoleList RoleList statis publik (IDictionary paramDic, string SortExpression, int startRowIndex, int maksimumRows)
{
return DataPortal.Fetch<RoleList>(PagingCriteria<RoleList>(paramDic, startRowIndex, maksimumRows, SortExpression, "ID"));
}Bagian penomoran halaman Gridview:
<Templat Pager>
<br />
Total baris <asp:Label ID="lblTotal" runat="server" ></asp:Label>
<asp:Label ID="lblPage" runat="server" Text='<%# "Halaman" + (((GridView)Container.NamingContainer).PageIndex + 1) + "Halaman/Total" + (((GridView) Kontainer.NamingContainer).PageCount) + "halaman" %> '></asp:Label>
<asp:LinkButton ID="lbnFirst" runat="Server" Text="Home" Diaktifkan='<%# ((GridView)Container.NamingContainer).PageIndex != 0 %>'
CommandName="Halaman" CommandArgument="Pertama"></asp:LinkButton>
<asp:LinkButton ID="lbnPrev" runat="server" Text="Halaman Sebelumnya" Diaktifkan='<%# ((GridView)Container.NamingContainer).PageIndex != 0 %>'
CommandName="Halaman" CommandArgument="Sebelumnya"></asp:LinkButton>
<asp:LinkButton ID="lbnNext" runat="Server" Text="Halaman Berikutnya" Diaktifkan='<%# ((GridView)Container.NamingContainer).PageIndex != (((GridView)Container.NamingContainer).PageCount - 1) %>'
CommandName="Page" CommandArgument="Berikutnya"></asp:LinkButton>
<asp:LinkButton ID="lbnLast" runat="Server" Text="Halaman terakhir" Diaktifkan='<%# ((GridView)Container.NamingContainer).PageIndex != (((GridView)Container.NamingContainer).PageCount - 1) %>'
CommandName="Halaman" CommandArgument="Terakhir"></asp:LinkButton>
<br />
</PagerTemplate> Yang perlu dijelaskan di sini adalah jumlah baris diperoleh melalui properti list.TotalRowCount. Oleh karena itu, RoleList perlu mengimplementasikan antarmuka Csla.Core.IReportTotalRowCount.
Anda mungkin bertanya, mengapa tidak menulis jumlah baris secara langsung di Gridview dan PagerTemplate? Faktanya, ini karena Gridview tidak mengekspos properti ini, objek System.Web.UI.DataSourceSelectArguments.
Setelah memperoleh data, jumlah total baris akan dikembalikan ke dalam Gridview, tetapi Gridview akan membuat PagedDataSourse lokal dalam metode pribadi dan mencatat jumlah total baris di dalamnya cerminan.
Jadi cara paling sederhana adalah dengan menuliskannya terlebih dahulu, lalu menuliskannya di acara RowDataBound. Jika Anda memerlukan kesempurnaan, Anda dapat merangkum Gridview sendiri dan menambahkan properti TotalRowCount, dan mengeksposnya.