J'utilise CSLA.NET pour travailler sur un projet Web et j'ai découvert que le modèle CSLA n'est pas très adapté aux conditions nationales de la Chine lors du développement du Web.
Sa série de modèles sont tous basés sur la prise en compte de formulaires maître-détails, tels que « Bon de commande », qui comporte un seul en-tête et des lignes de détail, ce qui est idéal sous WinForm.
Mais sur le Web, la plupart des objets sont édités à l'aide d'un formulaire distinct, ce qui semble un peu gênant.
Ma compréhension n'est pas encore approfondie et j'apprends encore. L'ensemble du cadre m'a beaucoup profité. Assez de bêtises, venons-en au fait.
Pour utiliser facilement la pagination SQL2005 dans le modèle CSLA, nous devons suivre quatre étapes.
Étape 1 : implémentez un PagingCriteria pour transmettre les paramètres de pagination.
[Sérialisable()]
classe publique PagingCriteria<T> : CriteriaBase
{
#région déposée
public IDictionary ParamDic { obtenir ; ensemble privé ;
chaîne publique SortExpression { obtenir ; ensemble privé ;
chaîne publique DefaultOrder { get ; ensemble privé ;
public int StartRowIndex { obtenir ; ensemble privé ;
public int MaximumRows { obtenir ; ensemble privé ;
#endregion
protectedPagingCriteria(){ }
public PagingCriteria (IDictionary paramDic, int startRowIndex, int maximumRows, chaîne sortExpression, chaîne defaultOrder)
: base(typede(T))
{
ParamDic = paramDic;
SortExpression = sortExpression;
Ordre par Défaut = Ordre par défaut ;
StartRowIndex = startRowIndex ;
MaximumRows = maximumRows;
}
}
Étape 2 : implémentez PagingWrapper pour encapsuler des instructions SQL ordinaires dans des instructions de pagination.
classe statique publique PagingWrapper
{
chaîne de const privée SQLTEMPLATE = @"Avec TargetTable AS (sélectionnez ROW_NUMBER() OVER (ordre par Temp.{1})comme RowNumber,Temp.* de ({0}) comme Temp) sélectionnez * dans TargetTable WHERE RowNumber entre {2} et {3} ; Sélectionnez count(*) dans ({0}) Temp" ;
chaîne statique publique Wrap (string sqlQuery, string SortExpression, int startRowIndex, int maximumRows)
{
si (string.IsNullOrEmpty(SortExpression))
throw new Exception("Aucune colonne de tri spécifiée.");
return string.Format(SQLTEMPLATE, sqlQuery, SortExpression, startRowIndex +1, startRowIndex + maximumRows);
}
chaîne statique publique Wrap<T>(chaîne sqlQuery, critères PagingCriteria<T>)
{
ordre des chaînes = (string.IsNullOrEmpty(criteria.SortExpression)) critères.DefaultOrder : critères.SortExpression;
return Wrap (sqlQuery, ordre, critères.StartRowIndex, critères.MaximumRows);
}
}
Partie 3 : Appelé dans l'objet de collection. Voici RoleList.
en utilisant (SqlCommand cm = cn.CreateCommand())
{
cm.CommandType = CommandType.Text;
string sql = "SELECT * FROM Rôles" ;
cm.CommandText = PagingWrapper.Wrap(sql, critères);
en utilisant (SafeDataReader dr = new SafeDataReader(cm.ExecuteReader()))
{
tandis que (dr.Read())
Ajouter(Role.FillRole(dr));
dr.NextResult();
dr.Read();
TotalRowCount = dr.GetInt32(0);
}
}CommandText est renvoyé en appelant Wrapper. La propriété TotalRowCount est l'implémentation de l'interface Csla.Core.IReportTotalRowCount.
Étape 4 : utilisez le contrôle de source de données sur la page, liez Gridview et implémentez la pagination :
private int totalCount = 0 ;
protected void CslaDs_SelectObject (expéditeur de l'objet, Csla.Web.SelectObjectArgs e)
{
BLL.Security.RoleList list = BLL.Security.RoleList.PagingRoleList (null, e.SortExpression, e.StartRowIndex, e.MaximumRows);
e.BusinessObject = liste ;
totalCount = liste.TotalRowCount ;
}
protected void gvlist_RowDataBound (expéditeur de l'objet, GridViewRowEventArgs e)
{
si (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"));
}Partie de pagination Page Gridview :
<Modèle de pager>
<br />
Total de <asp:Label ID="lblTotal" runat="server" ></asp:Label> lignes
<asp:Label ID="lblPage" runat="server" Text='<%# "Page" + (((GridView)Container.NamingContainer).PageIndex + 1) + "Pages/Total" + (((GridView) Container.NamingContainer).PageCount) + "page" %> '></asp:Label>
<asp:LinkButton ID="lbnFirst" runat="Server" Text="Home" Enabled='<%# ((GridView)Container.NamingContainer).PageIndex != 0 %>'
CommandName="Page" CommandArgument="First"></asp:LinkButton>
<asp:LinkButton ID="lbnPrev" runat="server" Text="Page précédente" Enabled='<%# ((GridView)Container.NamingContainer).PageIndex != 0 %>'
CommandName="Page" CommandArgument="Prev"></asp:LinkButton>
<asp:LinkButton ID="lbnNext" runat="Server" Text="Page suivante" Enabled='<%# ((GridView)Container.NamingContainer).PageIndex != (((GridView)Container.NamingContainer).PageCount - 1) %>'
CommandName="Page" CommandArgument="Suivant"></asp:LinkButton>
<asp:LinkButton ID="lbnLast" runat="Server" Text="Dernière page" Enabled='<%# ((GridView)Container.NamingContainer).PageIndex != (((GridView)Container.NamingContainer).PageCount - 1) %>'
CommandName="Page" CommandArgument="Last"></asp:LinkButton>
<br />
</PagerTemplate> Ce qu'il faut expliquer ici, c'est que le nombre total de lignes est obtenu via la propriété list.TotalRowCount. Par conséquent, RoleList doit implémenter l'interface Csla.Core.IReportTotalRowCount.
Vous vous demandez peut-être pourquoi ne pas écrire le nombre total de lignes directement dans Gridview et PagerTemplate. En fait, c'est parce que Gridview n'expose pas cette propriété, l'objet System.Web.UI.DataSourceSelectArguments.
Après avoir obtenu les données, le nombre total de lignes sera renvoyé à l'intérieur du Gridview, mais le Gridview construira un PagedDataSourse local dans une méthode privée et y enregistrera le nombre total de lignes. Il ne peut pas être obtenu de l'extérieur, ni via. réflexion.
Le moyen le plus simple consiste donc à l'écrire d'abord, puis à l'écrire dans l'événement RowDataBound. Si vous avez besoin de perfection, vous pouvez encapsuler vous-même un Gridview, ajouter la propriété TotalRowCount et l'exposer.