Cette section explique principalement comment utiliser ABP pour la pagination en arrière-plan, et explique également la mise en œuvre de la logique de pagination en arrière-plan ABP. Il montre également comment utiliser X.PagedList pour la pagination frontale
Après avoir terminé l'ajout, la suppression, la modification et la vérification de la liste des tâches, parlons de la fonction de pagination essentielle.
Tout d'abord, je suis très heureux qu'ABP nous ait aidé à encapsuler l'implémentation de la pagination, ce qui est vraiment attentionné.
Allez, voyons comment utiliser ABP pour la pagination dans cette section.
1. Définition DTO de la demande de pagination
Transfert de donnéesObjet(Transfert de données Objets ) est utilisé pour la transmission de données au niveau de la couche application et de la couche présentation.
La couche de présentation transmet un objet de transfert de données (DTO) pour appeler une méthode de service d'application, puis le service d'application exécute une logique métier spécifique via l'objet de domaine et renvoie le DTO à la couche de présentation. De cette façon, la couche de présentation et la couche de domaine sont complètement séparées. Dans une application bien structurée, la couche de présentation n'utilise pas directement les objets du domaine (entrepôts, entités).
Lorsque nous avons une demande de pagination dans la couche de présentation, nous devons généralement spécifier deux paramètres, l'un sert à marquer la page et l'autre est le nombre de lignes par page (généralement il y a un fichier de configuration configuration).
La pagination étant une fonction très couramment utilisée, lorsque nous avons une requête de pagination dans la couche de présentation, il est préférable d'avoir un DTO correspondant pour encapsuler ces deux paramètres.
Il n'existe pas de classe publique de ce type encapsulée pour nous dans le code source d'ABP, mais dans le projet ABPZero, la pagination correspondante Dto est définie.
Le diagramme de classes correspondant est le suivant :
Tri des pages et filtrage du diagramme de classes Dto correspondant
On voit qu'il comprend principalement les quatre définitions DTO courantes suivantes :
PagedInputDto : demande de pagination Dto
PagedAndSortedInputDto : tri de pagination Dto
PagedSortedAndFilteredInputDto :Tri et filtrage des pages Dto
PagedAndFilteredInputDto : Pagination et filtrage Dto
Est-ce très pratique Notre pagination est-elle ? généralement mélangé avec le filtrage et le tri.
Les principaux attributs suivants sont principalement définis :
MaxResultCount : Le nombre de lignes par page, qui peut être lu à partir de la configuration définie .
SkipCount : Le nombre de sauts. La formule de calcul générale est SkipCount=Page*MaxResultCount (nombre de pages*nombre de lignes).
Filtre : Filtrer Chaîne
Tri : Trier par
Je n'entrerai pas dans les détails de l'implémentation spécifique. Je pense que vous pouvez l'implémenter vous-même si vous regardez attentivement le diagramme de classes. AbpZero définit ces Dtos publics dans le dossier Dto de la couche de service d'application. Les chemins spécifiques sont les suivants.
2. Comment utiliser la pagination DTO
Prenons notre liste de tâches comme exemple, nous modifions et créez GetTaskInputDto
, laissez hériter de de PagedSortedAndFilteredInputDto
, afin que GetTaskInputDto
ait les attributs nécessaires au tri et au filtrage des paginations.
public class GetTasksInput : PagedSortedAndFilteredInputDto { public TaskState? State { get; set; } public int? AssignedPersonId { get; set; } }
3. Renvoyer les résultats paginés DTO
Abp a défini un PagedResultDto générique pour que nous puissions envelopper les résultats de pagination renvoyés. Il comprend principalement deux attributs, int TotalCount enregistre le nombre total et IReadOnlyList
4. Implémentation de la logique de pagination de la couche de service d'application
1 Définir l'interface
<🎜 dans ITaskAppService. >PagedResultDto<TaskDto> GetPagedTasks(GetTasksInput input);
public PagedResultDto<TaskDto> GetPagedTasks(GetTasksInput input) { //初步过滤 var query = _taskRepository.GetAll().Include(t => t.AssignedPerson) .WhereIf(input.State.HasValue, t => t.State == input.State.Value) .WhereIf(!input.Filter.IsNullOrEmpty(), t => t.Title.Contains(input.Filter)) .WhereIf(input.AssignedPersonId.HasValue, t => t.AssignedPersonId == input.AssignedPersonId.Value); //排序 query = !string.IsNullOrEmpty(input.Sorting) ? query.OrderBy(input.Sorting) : query.OrderByDescending(t => t.CreationTime); //获取总数 var tasksCount = query.Count(); //默认的分页方式 //var taskList = query.Skip(input.SkipCount).Take(input.MaxResultCount).ToList(); //ABP提供了扩展方法PageBy分页方式 var taskList = query.PageBy(input).ToList(); return new PagedResultDto<TaskDto>(tasksCount,taskList.MapTo<List<TaskDto>>()); }
et WhereIf
qui n'ont jamais été utilisées dans Linq Oui, ce sont des méthodes d'extension fournies par ABP. Si vous êtes intéressé, vous pouvez en prendre une. regardez le code source <🎜 L'implémentation spécifique de > est en fait très simple, mais nous ne pourrons peut-être pas y penser lorsque nous utilisons habituellement Linq. PageBy
QueryableExtensions
Quelques questions ici :
Combien de requêtes ont été effectuées dans ce code ?
代码中使用的是什么分页技术?(真分页?假分页?)
5. 使用X.PagedList进行前端分页
在Asp.Net Mvc中进行前端分页有一系列开源实现,在我的Demo中使用的是开源的X.PagedList分页。想了解具体源码,请参考X.PagedList GitHub。
1、请自行在Web项目中安装X.PagedList.Mvc Nuget程序包
X.PagedList.Mvc Nuget程序包
2、在Controller中使用X.PagedList提供的方法构造分页结果供前端使用
因为我们在应用服务层已经手动实现了分页逻辑,所以按照X.PagedList官网示例,我们需要自行构造StaticPagedList作为返回结果。
public ActionResult PagedList(int? page) { //每页行数 var pageSize = 5; var pageNumber = page ?? 1;//第几页 var filter = new GetTasksInput { SkipCount = (pageNumber - 1) * pageSize,//忽略个数 MaxResultCount = pageSize }; var result = _taskAppService.GetPagedTasks(filter); //已经在应用服务层手动完成了分页逻辑,所以需手动构造分页结果 var onePageOfTasks = new StaticPagedList<TaskDto>(result.Items, pageNumber, pageSize, result.TotalCount); //将分页结果放入ViewBag供View使用 ViewBag.OnePageOfTasks = onePageOfTasks; return View(); }
从代码中可以看到我们构造完X.PagedList提供的分页结果后放入了ViewBag中,供视图使用。
3、View中添加分页控件
PagedList视图的代码如下:
@using X.PagedList.Mvc; @using Abp.Web.Mvc.Extensions @using X.PagedList; <link href="~/Content/PagedList.css" rel="external nofollow" rel="stylesheet" /> <ul class="list-group"> @foreach (var task in ViewBag.OnePageOfTasks) { <li class="list-group-item"> <p class="btn-group pull-right"> <button type="button" class="btn btn-info">Edit</button> <button type="button" class="btn btn-success">Delete</button> </p> <p class="media"> <a class="media-left" href="#" rel="external nofollow" > @*<i class="fa @Model.GetTaskLable(task) fa-3x"></i>*@ </a> <p class="media-body"> <h4 class="media-heading">@task.Title</h4> <span class="text-muted">@task.CreationTime.ToString("yyyy-MM-dd HH:mm:ss")</span> </p> </p> </li> } </ul> @Html.PagedListPager((IPagedList)ViewBag.OnePageOfTasks, page => Url.Action("PagedList", new { page }))
其中最后一句代码是用来生成分页控件。
最终效果如图:
总结
总结
本节主要讲解了如何使用ABP进行后台分页,并顺带讲解了ABP后台分页逻辑的实现方式。同时也演示了如何使用X.PagedList进行前端分页。
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!