Using @Html.DisplayNameFor() with PagedList

asp.net-mvc asp.net-mvc-4 entity-framework pagedlist razor

Question

I've been trying out the PagedList package to get paging for my index views. Everything was going well, and at the controller level everything is working fine, it only displays 5 records per page, and displays the appropriate page based on the querystring.

My problem is in the view. I changed the @Model to PagedList.IPagedList so I could access the Model.HasNextPage and other properties, but now the @Html.DisplayNameFor(model => model.ItemName) are no longer working. I get this error:

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?)

Here are the relevant parts of the view:

@model PagedList.IPagedList<Dossier.Models.Item>
@using Dossier.Models.Item

...

<th>
    @Html.DisplayNameFor(model => model.ItemName)
</th>

It seems IPagedList is not compatible with DisplayNameFor(). Any idea why this is happening, and how I could fix it? I know I could just manually enter the column names, but I'd like for that information to stay (and be changeable) in the model later.

1
45
2/18/2013 4:04:16 AM

Accepted Answer

You can try this

@Html.DisplayNameFor(model => model.FirstOrDefault().ItemName)
79
5/25/2016 6:55:22 AM

Popular Answer

As an alternate solution to the accepted answer, remember that IPagedList inherits from IEnumerable. That means that you could write:

@model IEnumerable<Dossier.Models.Item>

At the beginning of the page, and just cast the model to IPagedList when needed:

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

You can even declare the casted variable in the header, in order to use it multiple times within the page:

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

This would allow you to use the DisplayNameFor helper method, and access all PagedList methods/properties, without the need for dummy elements nor calling .FirstOrDefault() for each field.



Related Questions





Related

Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow
Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow