使用带有PagedList和ViewModel的其他过滤器

时间:2013-03-18 21:20:59

标签: asp.net-mvc razor automapper pagedlist

当我使用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中拥有SortOrderSearchFilterIncludeCompleted等属性,因为目前它们在ViewBags中被传递而且我想清理它。

@Html.ActionLink("Name", "Index", new {sortOrder=ViewBag.NameSortParam, 
                                  includeComplete = ViewBag.IncludeCompleted})

但是因为它们不是ToDo实体的一部分,所以它们真的属于我被困的ToPagedList扩展。理想情况下,我想以某种方式将它们与作为PagedList公开的其他属性(例如PageCountPageNumber一起传递,但是不能派生我自己的PagedList或分支原始我不看看我如何支持传递这些属性。 github页面上的所有示例都大量使用ViewBag。

我无法在IndexToDoViewModel周围添加包装类,因此它具有IEnumerable或IPagedList以及排序属性,因此这会使我的AutoMappings无效。

我是否坚持使用ViewBags进行SortOrder过滤器,或者通过使用AutoMapper获取包含在我的ViewModel中的属性并保持视图强类型来获取蛋糕并使用它?

0 个答案:

没有答案