使用Linq构建PagedList遇模型适配问题,求问题排查方案
问题分析与修正方案
你的代码存在多处不匹配和逻辑错误,导致分页功能无法正常工作,具体问题及修正如下:
核心问题点
- 模型类型不兼容:View声明的模型是
IPagedList<Model_Table>,但Controller返回的是单个Model_Table实例,两者完全不匹配。 - 分页参数混淆:Controller接收的是
pagesize(每页数量),但分页控件传递的是SayfaNo(页码),参数名不对应;且ToPagedList参数顺序错误(正确顺序是(页码, 每页数量))。 - 分页对象未生效:
model.D1Lists.OrderBy(...).ToPagedList(...)的结果未保存,分页逻辑白执行。 - 控制器跳转错误:分页控件指定了
Home控制器,但实际逻辑在DenemeController,会导致跳转失效。 - Join类型不匹配:
a.Table2_ID(数值类型)与c.table3_ID.ToString()(字符串)进行关联,类型不兼容会引发异常。
修正后的Controller代码
using System; using System.Linq; using System.Web.Mvc; using DDD.Models; using PagedList; namespace DDDD.Controllers { public class DenemeController : Controller { DDDEntities _db = new DDDEntities(); // 接收页码参数,默认显示第1页,每页固定10条(可改为参数传入) public ActionResult Index(int? sayfaNo) { int mevcutSayfa = sayfaNo ?? 1; int sayfaBoyutu = 10; // 修正Join类型匹配:根据实际数据库字段类型调整,示例假设两边均为数值类型 var veriListesi = from o in _db.table1 join a in _db.table2 on o.table1_ID equals a.Table2_ID join c in _db.table3 on a.Table2_ID equals c.table3_ID select new D1List { A1 = o.B1, A2 = o.B2, A3 = a.B3, table_name = o.table_name // 确保该字段存在,用于排序 }; // 先排序再生成分页对象,注意参数顺序:页码在前,每页数量在后 var sayfalistirilmisVeri = veriListesi.OrderByDescending(m => m.table_name) .ToPagedList(mevcutSayfa, sayfaBoyutu); Model_Table model = new Model_Table(); model.D1Lists = sayfalistirilmisVeri; // 确保Model_Table的D1Lists属性类型为IPagedList<D1List> return View(model); } } }
修正后的View代码
@using PagedList @using PagedList.Mvc @using DDD.Models @model Model_Table // 与Controller返回的模型类型保持一致 @{ ViewBag.Title = "Title"; Layout = "~/Views/Shared/_Layout.cshtml"; } <h2>mmm</h2> <div id="table"> <table> <thead> <tr> <th>Şirket Adı</th> <th>Müşteri Adı</th> <th>Şehir</th> </tr> </thead> <tbody> <!-- 遍历Model中的分页列表 --> @foreach (var item in Model.D1Lists) { <tr> <td>@item.A1</td> <td>@item.A2</td> <td>@item.A3</td> </tr> } </tbody> </table> <!-- 修正控制器名称为Deneme,传递正确的页码参数 --> @Html.PagedListPager(Model.D1Lists, sayfaNo => Url.Action("Index", "Deneme", new { sayfaNo = sayfaNo })) </div>
额外注意事项
- 确保
Model_Table类中D1Lists属性的类型为IPagedList<D1List>,而非普通List<D1List>:public class Model_Table { public IPagedList<D1List> D1Lists { get; set; } // 其他属性... } - 如果
c.table3_ID是字符串类型,需将a.Table2_ID转为字符串再进行Join:join c in _db.table3 on a.Table2_ID.ToString() equals c.table3_ID - 确认
D1List类中存在用于排序的table_name字段,若不存在需替换为实际可用的排序字段。
内容的提问来源于stack exchange,提问作者lemoncher2
相关产品推荐
相关产品推荐

