Estou usando o CSLA.NET para trabalhar em um projeto da Web e descobri que o modelo CSLA não é muito adequado para as condições nacionais da China no desenvolvimento da Web.
Sua série de modelos é toda baseada na consideração de formulários mestre-detalhados, como "Pedido de Compra", que possui um único cabeçalho e linhas de detalhes, o que é ótimo no WinForm.
Mas na Web, a maioria dos objetos é editada usando um formulário separado, então parece um pouco estranho.
Meu entendimento ainda não é profundo e ainda estou aprendendo. Toda a estrutura me beneficiou muito.
Para usar convenientemente a paginação Sql2005 no modelo CSLA, precisamos executar quatro etapas.
Etapa 1: implemente um PagingCriteria para passar parâmetros de paginação.
[Serializável()]
classe pública PagingCriteria<T> : CriteriaBase
{
#region Arquivado
public IDictionary ParamDic { get; conjunto privado }
public string SortExpression { get; conjunto privado }
string pública DefaultOrder { get; conjunto privado }
public int StartRowIndex { obter; conjunto privado }
public int MaximumRows { get; conjunto privado }
#endregion
protectedPagingCriteria(){ }
public PagingCriteria (IDictionary paramDic, int startRowIndex, int MaximumRows, string sortExpression, string defaultOrder)
:base(tipode(T))
{
ParamDic = paramDic;
SortExpression = sortExpression;
OrdemDefault = ordemdefault;
StartRowIndex = startRowIndex;
MáximoRows = máximoRows;
}
}
Etapa 2: Implemente o PagingWrapper para encapsular instruções SQL comuns em instruções de paginação.
classe estática pública PagingWrapper
{
private const string SQLTEMPLATE = @"Com TargetTable AS (selecione ROW_NUMBER() OVER (ordenar por Temp.{1}) como RowNumber,Temp.* de ({0}) como Temp) selecione * de TargetTable WHERE RowNumber entre {2} e {3};Selecione contagem(*) de ({0}) Temp";
string estática pública Wrap (string sqlQuery, string SortExpression, int startRowIndex, int maximoRows)
{
if (string.IsNullOrEmpty(SortExpression))
throw new Exception("Nenhuma coluna de classificação especificada.");
retornar string.Format (SQLTEMPLATE, sqlQuery, SortExpression, startRowIndex +1, startRowIndex + MaximumRows);
}
string estática pública Wrap<T>(string sqlQuery, critérios PagingCriteria<T>)
{
string order = (string.IsNullOrEmpty(criteria.SortExpression)) ? critérios.DefaultOrder : critérios.SortExpression;
return Wrap(sqlQuery, pedido, critérios.StartRowIndex, critérios.MaximumRows);
}
}
Parte 3: Chamado no objeto de coleção Aqui está RoleList.
usando (SqlCommand cm=cn.CreateCommand())
{
cm.CommandType = CommandType.Text;
string sql = "SELECT * FROM Funções";
cm.CommandText = PagingWrapper.Wrap(sql, critérios);
usando (SafeDataReader dr = new SafeDataReader(cm.ExecuteReader()))
{
enquanto (dr.Read ())
Adicionar(Role.FillRole(dr));
dr.NextResult();
dr.Leitura();
TotalRowCount = dr.GetInt32(0);
}
}CommandText é retornado chamando Wrapper. A propriedade TotalRowCount é a implementação da interface Csla.Core.IReportTotalRowCount.
Etapa 4: use o controle de fonte de dados na página, vincule o Gridview e implemente a paginação:
private int contagem total = 0;
void protegido CslaDs_SelectObject (remetente do objeto, Csla.Web.SelectObjectArgs e)
{
Lista BLL.Security.RoleList = BLL.Security.RoleList.PagingRoleList(null, e.SortExpression, e.StartRowIndex, e.MaximumRows);
e.BusinessObject = lista;
totalCount = lista.TotalRowCount;
}
void protegido gvlist_RowDataBound (remetente do objeto, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.Pager)
{
((Rótulo)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, maximoRows, SortExpression, "ID"));
}Parte de paginação do Page Gridview:
<PagerTemplate>
<br />
Total de <asp:Label ID="lblTotal" runat="server" ></asp:Label> linhas
<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="Server" Text="Home" Enabled='<%# ((GridView)Container.NamingContainer).PageIndex != 0 %>'
CommandName="Página" CommandArgument="First"></asp:LinkButton>
<asp:LinkButton ID="lbnPrev" runat="server" Text="Página anterior" Enabled='<%# ((GridView)Container.NamingContainer).PageIndex != 0 %>'
CommandName="Página" CommandArgument="Anterior"></asp:LinkButton>
<asp:LinkButton ID="lbnNext" runat="Server" Text="Próxima página" Enabled='<%# ((GridView)Container.NamingContainer).PageIndex != (((GridView)Container.NamingContainer).PageCount - 1) %>'
CommandName="Página" CommandArgument="Próximo"></asp:LinkButton>
<asp:LinkButton ID="lbnLast" runat="Server" Text="Última página" Enabled='<%# ((GridView)Container.NamingContainer).PageIndex != (((GridView)Container.NamingContainer).PageCount - 1) %>'
CommandName="Página" CommandArgument="Last"></asp:LinkButton>
<br />
</PagerTemplate> O que deve ser explicado aqui é que o número total de linhas é obtido através da propriedade list.TotalRowCount Portanto, RoleList precisa implementar a interface Csla.Core.IReportTotalRowCount.
Você pode perguntar, por que não escrever o número total de linhas diretamente em Gridview e PagerTemplate? Na verdade, é porque Gridview não expõe esta propriedade, objeto System.Web.UI.DataSourceSelectArguments.
Após a obtenção dos dados, o número total de linhas será retornado para dentro do Gridview, mas o Gridview construirá um PagedDataSourse local em um método privado e registrará o número total de linhas nele. reflexão.
Portanto, a maneira mais simples é anotá-lo primeiro e, em seguida, escrevê-lo no evento RowDataBound. Se precisar de perfeição, você mesmo pode encapsular um Gridview e adicionar a propriedade TotalRowCount e expô-lo.