Estoy usando CSLA.NET para trabajar en un proyecto web y descubrí que el modelo CSLA no es muy adecuado para las condiciones nacionales de China al desarrollar la Web.
Todas sus series de plantillas se basan en la consideración de formularios maestro-detalle, como "Orden de compra", que tiene un solo encabezado y filas de detalles, lo cual es excelente en WinForm.
Pero en la Web, la mayoría de los objetos se editan usando un formulario separado, por lo que resulta un poco incómodo.
Mi comprensión aún no es profunda y todavía estoy aprendiendo. Todo el marco me ha beneficiado mucho. Basta de tonterías, vayamos al grano.
Para utilizar cómodamente la paginación Sql2005 en el modelo CSLA, debemos seguir cuatro pasos.
Paso 1: implementar un PagingCriteria para pasar parámetros de paginación.
[Serializable()]
clase pública PagingCriteria<T>: CriteriaBase
{
#región Archivado
IDictionario público ParamDic {obtener; conjunto privado;
cadena pública SortExpression {obtener; conjunto privado;
cadena pública DefaultOrder {obtener; conjunto privado;
público int StartRowIndex {obtener; conjunto privado;
public int MaximumRows {obtener; conjunto privado;
#regiónfinal
criterios de paginación protegidos(){ }
Criterios de paginación públicos (IDictionary paramDic, int startRowIndex, int MaximumRows, string sortExpression, string defaultOrder)
: base(tipo de(T))
{
ParamDic = paramDic;
SortExpression = sortExpression;
Orden predeterminada = Orden predeterminada;
InicioRowIndex = inicioRowIndex;
Filas máximas = Filas máximas;
}
}
Paso 2: Implemente PagingWrapper para encapsular declaraciones SQL ordinarias en declaraciones de paginación.
clase estática pública PagingWrapper
{
cadena const privada SQLTEMPLATE = @"Con TargetTable AS(seleccione ROW_NUMBER() OVER (ordenar por Temp.{1})como RowNumber,Temp.* de ({0}) como Temp) seleccione * de TargetTable DONDE RowNumber entre {2} y {3};Seleccione recuento (*) de ({0}) Temp";
envoltura de cadena estática pública (cadena sqlQuery, cadena SortExpression, int startRowIndex, int MaximumRows)
{
si (cadena.IsNullOrEmpty(SortExpression))
throw new Exception("No se ha especificado ninguna columna de clasificación.");
devolver string.Format(SQLTEMPLATE, sqlQuery, SortExpression, startRowIndex +1, startRowIndex + MaximumRows);
}
Cadena estática pública Wrap<T>(cadena sqlQuery, criterios PagingCriteria<T>)
{
orden de cadena = (string.IsNullOrEmpty(criteria.SortExpression))? criterios.DefaultOrder: criterios.SortExpression;
return Wrap(sqlQuery, orden, criterios.StartRowIndex, criterios.MaximumRows);
}
}
Parte 3: Llamado en el objeto de colección. Aquí está RoleList.
usando (SqlCommand cm = cn.CreateCommand())
{
cm.CommandType = CommandType.Text;
string sql = "SELECCIONAR * DE Roles";
cm.CommandText = PagingWrapper.Wrap(sql, criterios);
usando (SafeDataReader dr = nuevo SafeDataReader(cm.ExecuteReader()))
{
mientras (dr.Read())
Agregar(Role.FillRole(dr));
dr.NextResult();
dr.Read();
TotalRowCount = dr.GetInt32(0);
}
}CommandText se devuelve llamando a Wrapper. La propiedad TotalRowCount es la implementación de la interfaz Csla.Core.IReportTotalRowCount.
Paso 4: utilice el control de fuente de datos en la página, vincule Gridview e implemente la paginación:
privado int totalCount = 0;
vacío protegido CslaDs_SelectObject (remitente del objeto, Csla.Web.SelectObjectArgs e)
{
BLL.Security.RoleList lista = BLL.Security.RoleList.PagingRoleList(null, e.SortExpression, e.StartRowIndex, e.MaximumRows);
e.BusinessObject = lista;
totalCount = lista.TotalRowCount;
}
void protegido gvlist_RowDataBound (remitente del objeto, GridViewRowEventArgs e)
{
si (e.Row.RowType == DataControlRowType.Pager)
{
((Label)e.Row.FindControl("lblTotal")).Texto = totalCount.ToString();
}
}Lista de roles estática pública PagingRoleList (IDictionary paramDic, cadena SortExpression, int startRowIndex, int MaximumRows)
{
return DataPortal.Fetch<RoleList>(new PagingCriteria<RoleList>(paramDic, startRowIndex, MaximumRows, SortExpression, "ID"));
}Parte de paginación de Page Gridview:
<Plantilla de buscapersonas>
<br />
Total de filas <asp:Label ID="lblTotal" runat="server" >>asp:Label>
<asp:Label ID="lblPage" runat="server" Text='<%# "Página" + (((GridView)Container.NamingContainer).PageIndex + 1) + "Páginas/Total" + (((GridView) Container.NamingContainer).PageCount) + "página" %> '></asp:Label>
<asp:LinkButton ID="lbnFirst" runat="Servidor" Text="Home" Enabled='<%# ((GridView)Container.NamingContainer).PageIndex != 0 %>'
CommandName="Página" CommandArgument="Primero"></asp:LinkButton>
<asp:LinkButton ID="lbnPrev" runat="servidor" Text="Página anterior" Enabled='<%# ((GridView)Container.NamingContainer).PageIndex != 0 %>'
CommandName="Página" CommandArgument="Anterior"></asp:LinkButton>
<asp:LinkButton ID="lbnNext" runat="Servidor" Text="Página siguiente" habilitado='<%# ((GridView)Container.NamingContainer).PageIndex != (((GridView)Container.NamingContainer).PageCount - 1) %>'
CommandName="Página" CommandArgument="Siguiente"></asp:LinkButton>
<asp:LinkButton ID="lbnLast" runat="Servidor" Text="Última página" Enabled='<%# ((GridView)Container.NamingContainer).PageIndex != (((GridView)Container.NamingContainer).PageCount - 1) %>'
CommandName="Página" CommandArgument="Último"></asp:LinkButton>
<br />
</PagerTemplate> Lo que se debe explicar aquí es que el número total de filas se obtiene a través de la propiedad list.TotalRowCount. Por lo tanto, RoleList necesita implementar la interfaz Csla.Core.IReportTotalRowCount.
Quizás se pregunte, ¿por qué no escribir el número total de filas directamente en Gridview y PagerTemplate? De hecho, es porque Gridview no expone esta propiedad, el objeto System.Web.UI.DataSourceSelectArguments.
Después de obtener los datos, el número total de filas se devolverá al interior de Gridview, pero Gridview construirá un PagedDataSourse local en un método privado y registrará el número total de filas en él. No se puede obtener externamente ni a través de él. reflexión.
Entonces, la forma más sencilla es escribirlo primero y luego escribirlo en el evento RowDataBound. Si necesita perfección, puede encapsular un Gridview usted mismo, agregar la propiedad TotalRowCount y exponerlo.