ホームページ >バックエンド開発 >C#.Net チュートリアル >ABP入門シリーズ ページング機能の実装方法を紹介

ABP入門シリーズ ページング機能の実装方法を紹介

高洛峰
高洛峰オリジナル
2017-03-19 10:34:112985ブラウズ

このセクションでは主に ABP をバックグラウンド ページングに使用する方法を説明し、ABP バックグラウンド ページング ロジックの実装についても説明します。同時に、フロントエンドページングに X.PagesList を使用する方法も示します

タスクリストの追加、削除、変更、確認が完了したら、肝心のページング機能について説明します。

まず第一に、ABP がページング実装のカプセル化を支援してくれたことがとてもうれしく思います。これは本当に思いやりがあります。

さあ、このセクションではページングに ABP を使用する方法を見てみましょう。

1. ページングリクエスト DTO 定義

Data Transfer Objects (Data Transfer Objects) は、アプリケーション層とプレゼンテーション層でのデータ送信に使用されます。

プレゼンテーション層はデータ転送オブジェクト (DTO) を渡してアプリケーション サービス メソッドを呼び出します。その後、アプリケーション サービスはドメイン オブジェクトを通じて特定のビジネス ロジックを実行し、DTO をプレゼンテーション層に返します。このようにして、プレゼンテーション層とドメイン層は完全に分離されます。適切に階層化されたアプリケーションでは、プレゼンテーション層はドメイン オブジェクト (ウェアハウス、エンティティ) を直接使用しません。

プレゼンテーション層にページングリクエストがある場合、通常は 2 つのパラメータを指定する必要があります。1 つはページをマークするために使用され、もう 1 つはページごとの行数です (通常は、設定ファイル設定があります) 。

ページングは​​非常に一般的に使用される機能であるため、プレゼンテーション層にページング リクエストがある場合、これら 2 つのパラメーターをカプセル化するために対応する DTO を用意することが最善です。

ABP ソース コードにはそのようなパブリック クラスがカプセル化されていませんが、ABPZero プロジェクトでは、対応するページング Dto が定義されています。

対応するクラス図は次のとおりです:

ABP入門シリーズ ページング機能の実装方法を紹介

対応する Dto クラス図のページング ソートとフィルタリング

主に次の 4 つのパブリック DTO 定義が含まれていることがわかります:

  1. PagesInputDto: ページング要求 Dto

  2. PagingAndSortedInputDto: ページングソート Dto

  3. PagesSortedAndFilteredInputDto: ページングソートとフィルタリング Dto

  4. PagesAndFilteredInputDto: ページングフィルタリング Dto

通常、ページングは​​フィルタリングやソートと組み合わせて使用​​されます。

以下の主な属性が主に定義されています:

  • MaxResultCount: 定義された設定から読み取ることができるページごとの行数。

  • SkipCount: ジャンプの数。一般的な計算式は SkipCount=Page*MaxResultCount (ページ数*行数) です。

  • Filter: stringsのフィルタリング

  • Sorting: 並べ替えメソッド

具体的な実装については、クラス図をよく見ていただければ、ご自身で実装できると思います。 AbpZero は、これらのパブリック Dto をアプリケーション サービス層の Dto フォルダーに定義します。具体的なパスは次のとおりです。

ABP入門シリーズ ページング機能の実装方法を紹介

2. ページング DTO の使用方法例として、作成した GetTaskInputDtoPagesSortedAndFilteredInputDto から

を継承し、GetTaskInputDto がページングの並べ替えとフィルタリングに必要な属性を持つようにします。 。


GetTaskInputDto,让它继承PagedSortedAndFilteredInputDto,这样GetTaskInputDto就拥有了进行分页排序过滤需要用到的属性。


public class GetTasksInput : PagedSortedAndFilteredInputDto
{
 public TaskState? State { get; set; }
 public int? AssignedPersonId { get; set; }
}


3. 返回分页结果DTO

Abp已经为我们定义了泛型的PagedResultDto用来包装返回的分页结果。其中主要包括两个属性,int TotalCount保存总个数,IReadOnlyList Items保存返回的分页结果集。

4. 应用服务层分页逻辑实现

1、 在ITaskAppService中定义接口

PagedResultDto<TaskDto> GetPagedTasks(GetTasksInput input);


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


分页的实现很简单,先进行过滤,排序,再进行分页,最后使用PagedResultDto封装分页结果。

细心的你也许发现了两个未曾在Linq中用过的方法WhereIfPageBy,是的,这是ABP提供的扩展方法,感兴趣的可以看下源码QueryableExtensions

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


3. ページ分割された結果を返す DTO🎜🎜🎜🎜Abp は、返されたページ分割結果をラップするために汎用の PagedResultDto を定義しました。これには主に 2 つの属性が含まれており、int TotalCount は合計数を保存し、IReadOnlyList Items は返されたページング結果セットを保存します。 🎜🎜🎜🎜4. アプリケーション サービス レイヤーのページング ロジックの実装🎜🎜🎜🎜1. ITaskAppService で インターフェイスを定義します。 🎜🎜
@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 }))
🎜
🎜🎜2. TaskAppService にインターフェイスを実装します: 🎜


🎜rrreee🎜
🎜🎜 ページングの実装は非常に簡単で、最初にフィルターします。 , 並べ替えてからページングを実行し、最後に PagedResultDto を使用してページングの結果をカプセル化します。 🎜🎜 注意していれば、Linq で使用されたことのない 2 つのメソッド WhereIfPageBy が見つかるかもしれません。これらは ABP によって提供される拡張メソッドです。興味があります。ソース コード QueryableExtensions の具体的な実装を見てください。実際、実装は非常に単純ですが、通常 linq を使用する場合は想像できないかもしれません。 🎜🎜ここでいくつかの質問があります: 🎜🎜このコードでクエリはいくつ行われましたか? 🎜

代码中使用的是什么分页技术?(真分页?假分页?)

5. 使用X.PagedList进行前端分页

Asp.Net Mvc中进行前端分页有一系列开源实现,在我的Demo中使用的是开源的X.PagedList分页。想了解具体源码,请参考X.PagedList GitHub。

1、请自行在Web项目中安装X.PagedList.Mvc Nuget程序包

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

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

最终效果如图:

ABP入門シリーズ ページング機能の実装方法を紹介总结

总结

本节主要讲解了如何使用ABP进行后台分页,并顺带讲解了ABP后台分页逻辑的实现方式。同时也演示了如何使用X.PagedList进行前端分页。

以上がABP入門シリーズ ページング機能の実装方法を紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。