在PagedList中使用@ Html.DisplayNameFor()

我一直在尝试使用PagedList包来获取我的索引视图的分页。 一切进展顺利,在控制器层面,一切工作正常,每页只显示5条logging,并根据查询string显示适当的页面。

我的问题是在看法。 我改变了@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()不兼容。 任何想法为什么发生这种情况,以及我如何解决这个问题? 我知道我可以手动input列名,但我希望这些信息可以在模型中保留(并且可以改变)。

你可以试试这个

 @Html.DisplayNameFor(model => model.FirstOrDefault().ItemName) 

作为接受的答案的替代解决scheme,请记住,IPagedList从IEnumerableinheritance。 这意味着你可以写:

 @model IEnumerable<Dossier.Models.Item> 

在页面的开头,只需要时将模型投射到IPagedList:

 @Html.PagedListPager((IPagedList)Model, page => Url.Action("Index", new { page = page })) 

您甚至可以在标题中声明铸造variables,以便在页面中多次使用它:

 @{ ViewBag.Title = "My page title"; var pagedlist = (IPagedList)Model; } 

这将允许您使用DisplayNameFor辅助方法,并访问所有PagedList方法/属性,而不需要虚拟元素,也不需要为每个字段调用.FirstOrDefault()。

我通过创build一个接受IPagedList<TModel>DisplayNameFor重载解决了这个问题。

 namespace PagedList.Mvc { public static class Extensions { [SuppressMessage("Microsoft.Design", "CA1006:DoNotNestGenericTypesInMemberSignatures", Justification = "This is an appropriate nesting of generic types")] public static MvcHtmlString DisplayNameFor<TModel, TValue>(this HtmlHelper<IPagedList<TModel>> html, Expression<Func<TModel, TValue>> expression) { return DisplayNameForInternal(html, expression); } [SuppressMessage("Microsoft.Usage", "CA1801:ReviewUnusedParameters", Justification = "This is an extension method")] internal static MvcHtmlString DisplayNameForInternal<TModel, TValue>(this HtmlHelper<IPagedList<TModel>> html, Expression<Func<TModel, TValue>> expression) { return DisplayNameHelper(ModelMetadata.FromLambdaExpression(expression, new ViewDataDictionary<TModel>()), ExpressionHelper.GetExpressionText(expression)); } internal static MvcHtmlString DisplayNameHelper(ModelMetadata metadata, string htmlFieldName) { string resolvedDisplayName = metadata.DisplayName ?? metadata.PropertyName ?? htmlFieldName.Split('.').Last(); return new MvcHtmlString(HttpUtility.HtmlEncode(resolvedDisplayName)); } } } 

我将向PageList项目发送一个拉取请求,将其包含到每个人的项目中。

您不需要更改@Html.DisplayNameFor 。 在视图中声明模型为:

 @model IEnumerable<Dossier.Models.Item> 

只要将你的寻呼机移动到局部视图(让它命名为“_Pager”):

 @model IPagedList ... @Html.PagedListPager(Model, page => Url.Action("Index", new { page, pageSize = Model.PageSize })) ... 

在您的视图中呈现寻呼机:

 @Html.Partial("_Pager", Model) 

而已。

PS您可以创buildHtml帮助,而不是局部视图…