Maison  >  Article  >  développement back-end  >  Introduction à la méthode de mise en œuvre de la fonction de pagination dans la série d'introduction ABP

Introduction à la méthode de mise en œuvre de la fonction de pagination dans la série d'introduction ABP

高洛峰
高洛峰original
2017-03-19 10:34:112949parcourir

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 :

Introduction à la méthode de mise en œuvre de la fonction de pagination dans la série dintroduction ABP

Tri des pages et filtrage du diagramme de classes Dto correspondant

On voit qu'il comprend principalement les quatre définitions DTO courantes suivantes :

  1. PagedInputDto : demande de pagination Dto

  2. PagedAndSortedInputDto : tri de pagination Dto

  3. PagedSortedAndFilteredInputDto :Tri et filtrage des pages Dto

  4. 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.

Introduction à la méthode de mise en œuvre de la fonction de pagination dans la série dintroduction ABP

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

PagedResultDto<TaskDto> GetPagedTasks(GetTasksInput input);


2. Implémentez l'interface dans TaskAppService :


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>>());
}


Paging The l'implémentation est très simple. Filtrez d'abord, triez, puis effectuez la pagination et enfin utilisez PagedResultDto pour encapsuler les résultats de la pagination.

Si vous faites attention, vous trouverez peut-être deux méthodes

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 est en fait très simple, mais nous ne pourrons peut-être pas y penser lorsque nous utilisons habituellement Linq. PageByQueryableExtensionsQuelques 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程序包

Introduction à la méthode de mise en œuvre de la fonction de pagination dans la série dintroduction ABP

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 }))

其中最后一句代码是用来生成分页控件。

最终效果如图:

Introduction à la méthode de mise en œuvre de la fonction de pagination dans la série dintroduction ABP总结

总结

本节主要讲解了如何使用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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn