我有各种数据模型——我们称它们为Account、User和Order。(最终还有更多。)
我的视图将显示 Account 对象、User 对象或 Order 对象的列表。每个视图都允许根据搜索条件过滤这些对象(每个条件对对象都是唯一的)。
仅使用页面的视图模型来实现分页的最佳方法是什么,以便每个动作模型都不必包含某种页面参数?我的目标是从页面视图中获取页面视图模型上的属性的分页信息。
注意:这是我开始处理这个问题的方法:
通用视图模型:
public ListViewModel<T> {
public List<T> Models {get;set;}
public PageRange PageRange {get;set;}
}
每个视图都有一个视图模型,可能看起来像这样:
public AccountListViewModel : ListViewModel<Account> { }
每个视图模型都包含对视图有帮助的元素(显然),包括可能传递回控制器进行过滤的标准。所以列表动作变成:
public ActionResult List(AccountListViewModel viewModel) {
var accounts = /* retrieve data based on properties of view model */
var trimmedAccounts = /* skip and take elements from accounts object based on viewModel.PageRange */
accounts.Models = trimmedAccounts
return View(viewModel);
}
除了查询字符串必须包含“PageRange.PageStart=#”(其中# 是一个整数)才能正确绑定之外,此方法有效。如果 MVC 在查询字符串中检测到“start=”并将其连接到视图模型,我只想让 MVC 调用 PageRange 的绑定。