我一直在尝试使用PagedList包来获取索引视图的分页。一切进展顺利,在控制器级别一切正常,每页只显示5条记录,并根据查询字符串显示相应的页面。
我的问题在视图中。我将@Model更改为PagedList.IPagedList
,因此我可以访问Model.HasNextPage
和其他属性,但现在@Html.DisplayNameFor(model => model.ItemName)
已不再有效。我收到这个错误:
PagedList.IPagedList<Dossier.Models.Item>' does not contain a definition for 'ItemName' and no extension method 'ItemName' accepting a first argument of type 'PagedList.IPagedList<Dossier.Models.Item>' could be found (are you missing a using directive or an assembly reference?)
以下是该观点的相关部分:
@model PagedList.IPagedList<Dossier.Models.Item>
@using Dossier.Models.Item
...
<th>
@Html.DisplayNameFor(model => model.ItemName)
</th>
似乎IPagedList与DisplayNameFor()不兼容。知道为什么会这样,以及我如何解决它?我知道我可以手动输入列名,但我希望稍后在模型中保留(并且可以更改)该信息。
答案 0 :(得分:75)
你可以试试这个
@Html.DisplayNameFor(model => model.FirstOrDefault().ItemName)
答案 1 :(得分:36)
作为已接受答案的替代解决方案,请记住IPagedList继承自IEnumerable。这意味着你可以写:
@model IEnumerable<Dossier.Models.Item>
在页面的开头,只需在需要时将模型转换为IPagedList:
@Html.PagedListPager((IPagedList)Model, page => Url.Action("Index", new { page = page }))
您甚至可以在标题中声明已转换的变量,以便在页面中多次使用它:
@{
ViewBag.Title = "My page title";
var pagedlist = (IPagedList)Model;
}
这将允许您使用DisplayNameFor帮助器方法,并访问所有PagedList方法/属性,而无需虚拟元素,也不为每个字段调用.FirstOrDefault()。
答案 2 :(得分:4)
我通过创建接受DisplayNameFor
的{{1}}重载来解决问题。
IPagedList<TModel>
我将向PageList项目发送拉取请求,以便将其包含在项目中供所有人使用。
答案 3 :(得分:1)
您无需更改@model IEnumerable<Dossier.Models.Item>
。在视图中声明模型:
@model IPagedList
...
@Html.PagedListPager(Model,
page => Url.Action("Index", new { page, pageSize = Model.PageSize }))
...
将您的寻呼机移至局部视图(让我们将其命名为&#34; _Pager&#34;):
@Html.Partial("_Pager", Model)
在视图中渲染寻呼机:
Item
多数民众赞成。
P.S。您可以创建Html帮助程序而不是部分视图...
答案 4 :(得分:0)
作为替代解决方案,您可以尝试:
@Html.DisplayNameFor(x => x.GetEnumerator().Current.ItemName)
即使列表为空也可以使用!