ViewBags を使用して並べ替え順序パラメーターを渡すことを回避できるように、使用時にPagedList.Mvc パッケージによって返されるオブジェクトに追加された追加のプロパティを取得する方法を知る必要があります。ToPagedList
それを使用ToPagedList
すると IEnumerable が IPagedList に変換され、PagedList.IPagedList<MyModel>
ページングを取得して a を使用しforeach
て結果をテーブルに表示できるようにビューを厳密に型指定したことを知っています。ただし、並べ替え順序やフィルター文字列などの追加の値を渡す方法はないようです。
AutoMapperを使用して、ドメイン モデルと ViewModel を次のようにマッピングし、ドメイン モデルを ViewModel にフラット化しています。
Mapper.CreateMap<ToDo, IndexToDoViewModel>()
.ForMember(dest => dest.Priority,
opt => opt.MapFrom(src => src.Priority.PriorityName))
.ForMember(dest => dest.Staff,
opt => opt.MapFrom(src => src.Staff.StaffName));
コントローラーでデータを返すためにできること
var query = Session.QueryOver<ToDo>();
var result = query.Fetch(p=>p.Priority).Eager
.Fetch(s=>s.Staff).Eager
.List();
var viewModel = AutoMapper.Mapper.Map<IEnumerable<ToDo>,
IEnumerable<IndexToDoViewModel>>(result)
.ToPagedList(pageNumber, PageSize);
return View(viewModel);
私のビューでは、このように強く入力できます
@model PagedList.IPagedList<TheWorkshop.Web.Models.Read.IndexToDoViewModel>
これにより、必要なページングをナイスシンプルで取得できます
@Html.PagedListPager(@Model, page => Url.Action("Index", new { page = page}))
Todo アイテムのリストを表示するには、
@foreach (var item in Model) { ....
それらを反復する
私が言ったように、問題は、現在、ViewBags で渡されているため、ViewModelSortOrder
にSearchFilter
やなどのプロパティも必要であり、それをクリーンアップしたいということです。IncludeCompleted
@Html.ActionLink("Name", "Index", new {sortOrder=ViewBag.NameSortParam,
includeComplete = ViewBag.IncludeCompleted})
しかし、それらは ToDo エンティティの一部ではないため、実際には ToPagedList 拡張機能に属しています。PageCount
理想的には、またはなどの PagedList によって公開される他のプロパティと一緒にそれらを渡したいのですがPageNumber
、独自の PagedList を派生させたり、オリジナルをフォークしたりしない限り、そのようなプロパティの受け渡しをサポートする方法がわかりません。github ページのすべての例では、ViewBag を多用しています。
私の周囲にラッパー クラスを追加できなかったIndexToDoViewModel
ため、IEnumerable または IPagedList と並べ替えプロパティがあり、AutoMappings が無効になります。
SortOrder フィルターに ViewBags を使用することにこだわっていますか、それとも、ViewModel に含まれるプロパティを取得し、AutoMapper を使用してビューを強く型付けしておくことで、ケーキを食べて食べる方法はありますか?