将@ Html.DisplayNameFor()与PagedList一起使用

时间:2013-02-18 04:04:16

标签: asp.net-mvc entity-framework razor asp.net-mvc-4 pagedlist

我一直在尝试使用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()不兼容。知道为什么会这样,以及我如何解决它?我知道我可以手动输入列名,但我希望稍后在模型中保留(并且可以更改)该信息。

5 个答案:

答案 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)

即使列表为空也可以使用!