当我使用ToPagedList
时,我需要知道如何在PagedList.Mvc package返回的对象中添加其他属性,以便我可以避免使用ViewBags来传递排序顺序参数。
我知道在使用ToPagedList
时,它会将IEnumerable转换为IPagedList,并且我将我的视图强烈键入PagedList.IPagedList<MyModel>
,这使我可以获得分页并使用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) { ....
迭代它们
正如我所说的那样,问题是我还希望在我的ViewModel中拥有SortOrder
,SearchFilter
和IncludeCompleted
等属性,因为目前它们在ViewBags中被传递而且我想清理它。
@Html.ActionLink("Name", "Index", new {sortOrder=ViewBag.NameSortParam,
includeComplete = ViewBag.IncludeCompleted})
但是因为它们不是ToDo实体的一部分,所以它们真的属于我被困的ToPagedList扩展。理想情况下,我想以某种方式将它们与作为PagedList公开的其他属性(例如PageCount
或PageNumber
一起传递,但是不能派生我自己的PagedList或分支原始我不看看我如何支持传递这些属性。 github页面上的所有示例都大量使用ViewBag。
我无法在IndexToDoViewModel
周围添加包装类,因此它具有IEnumerable或IPagedList以及排序属性,因此这会使我的AutoMappings无效。
我是否坚持使用ViewBags进行SortOrder过滤器,或者通过使用AutoMapper获取包含在我的ViewModel中的属性并保持视图强类型来获取蛋糕并使用它?