我使用以下代码来呈现寻呼机:
@Html.BootstrapPager(Request.QueryString("Page"), Function(index) Url.Action("Index", "Posts", New With {.page = index}), 14000, System.Web.Configuration.WebConfigurationManager.AppSettings("PageSize"), 15)
我的问题是,如果我使用
Model.Count
代替 14000
那么我只能得到 1 页记录,因为我使用skip 并在存储库中获取仅提取需要的记录。我如何在视图中访问已发布记录的总数,以便我不必立即将值硬编码到视图中?
原始寻呼机代码在这里。我将它转换为 VBNET 我正在使用它。如果记录计数是硬编码的,则效果很好。
这是回购协议:
Dim posts As IEnumerable(Of PostSummaryDTO)
Using db As BetterBlogContext = New BetterBlogContext
posts = db.be_Posts.OrderByDescending(Function(x) x.DateCreated).Select(Function(s) New PostSummaryDTO With {.Id = s.PostRowID, .PostDateCreated = s.DateCreated, .PostSummary = s.Description, .PostTitle = s.Title, .IsPublished = s.IsPublished}).Skip((Page - 1) * PageSize).Take(PageSize).ToList()
Return posts.ToList
End Using
您需要在下层中使用两种不同的方法 - 一种用于获取总计数,另一种用于获取所需的页面 - 然后从控制器调用它们,将模型中的两个结果传递到视图。 因此,模型不能是记录的集合;它必须是一个具有记录集合属性和计数属性的对象。 或者使用
ViewBag
来传递计数。
我们在办公室所做的就是建立一个服务层来包含业务逻辑和存储库来处理数据访问。 存储库中有一个方法可以返回
IQueryable
,它提供对特定表的所有记录的访问。 然后,服务中有一个或多个方法调用该存储库方法并以不同的方式使用它。 在这种情况下,服务中可能存在 GetTotalCount
方法和 GetPage
方法。 两者都会调用相同的存储库方法来获取相同的 IQueryable
,然后第一个方法将在结果上调用 Count
,而第二个方法将调用 Skip
和 Take
。 由于 Skip
和 Take
不会强制执行查询,因此您还可以在第二种方法中调用 ToArray
等。 该服务可能还有一个 GetRecord
方法,您可以传递一个 ID 并在内部调用 FirstOrDefault
来获取具有匹配 ID 的单个记录。 如果需要,您可以将服务和存储库整合到一个类中,但我建议将业务逻辑与数据访问分开。