【问题标题】:Unable to cast object of type 'System.Data.Entity.Infrastructure.DbQuery' to type 'PagedList.IPagedList'无法将“System.Data.Entity.Infrastructure.DbQuery”类型的对象转换为“PagedList.IPagedList”类型
【发布时间】:2016-05-05 09:40:51
【问题描述】:

我正在尝试对 ASP.NET MVC 5 应用程序使用分页。 我用过X.PagedList 我已经在一个简单的对象中正确实现了它,但是在使用更复杂的对象实现它时遇到了问题。例如,当我在论坛中拥有诸如帖子和评论之类的关系时。

我的模型具有以下结构

public class PublicReport
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int PublicReportID { get; set; }

    public string Title { get; set; }       
    ...
    public virtual Institutions Institution { get; set; }
    ...
}   

public class Institutions
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int InstitutionID { get; set; }
    public string Name { get; set; }
    ...
}

在控制器中是以下代码

public ActionResult ListReports(int? page)
{
    var pageNumber = page ?? 1;     
    var listOfReports = db.PublicReport.OrderByDescending(d => d.CreatedDate).Where(c => c.CategoryId == 1).ToList();
    listOfReports.ToPagedList(pageNumber, 3);
    return View("ReportList", listOfReports);
}

在视图(PartialView)中相关部分是

@model IEnumerable<RENJK.Models.PublicReport>

@using PagedList.Mvc;
@using PagedList;   

@foreach (var item in Model)
{
    <div class="consult-post-sec">
        <div class="row">
            <div class="col-sm-12">
                <p>@Html.DisplayFor(modelItem => item.Title)</p>
                <div class="consult-posts-by">
                    @Html.DisplayFor(modelItem => item.Institution.Name)
                </div>
            </div>
        </div>
    </div>
}

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

我得到的错误是

无法将“System.Collections.Generic.List`1[RENJK.Models.PublicReport]”类型的对象转换为“PagedList.IPagedList”类型。

问题似乎出在我想要显示 ListPager 的代码行的视图中,因为如果我删除它,错误将不会显示。

在这种情况下我该怎么办?

【问题讨论】:

    标签: c# asp.net-mvc entity-framework-6 pagedlist


    【解决方案1】:

    您没有将ToPagedList() 的结果分配给变量(因此没有返回IPagedList&lt;PublicReport&gt;,只是返回IEnumerable&lt;PublicReport&gt;)。将您的代码更改为

    public ActionResult ListReports(int? page)
    {
        var pageNumber = page ?? 1;     
        var listOfReports = db.PublicReport.OrderByDescending(d => d.CreatedDate).Where(c => c.CategoryId == 1).ToList();
         var pagedList = listOfReports.ToPagedList(pageNumber, 3); // modify
         return View("ReportList", pagedList ); // modify
     }
    

    还要注意视图中的模型应该是

    @model IPagedList<RENJK.Models.PublicReport>
    

    然后就不需要这个case了。它可以只是

    @Html.PagedListPager(Model, page => Url.Action(....`
    

    【讨论】:

    • 谢谢!我以为 ToPagedList 直接在 listOfReports 上操作
    猜你喜欢
    • 1970-01-01
    • 2016-02-07
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多