首页 > 解决方案 > 如何从 VarChar(MAX) 字段创建 PagedList

问题描述

我有一个带有 VARCHAR(MAX) 字段的数据库表,我希望能够使用 PagedList 在 MVC 视图中对该数据进行分页,我希望在 x 字符处分页。我猜这样做不会很漂亮。我的模型返回 MasterId int、contentData VarChar(MAX) 和其他一些字段。我想知道如何将 varchar(max) 字段转换为几页(数据中有分页符)。

我在想,因为我的模型只包含一个试图使用 PagedList 的 contentData 可能不起作用。

我应该尝试这个吗?我是否应该硬着头皮重新设计数据库表,然后重新设计相关的 CRUD 代码?

我想我可能最终会选择后一种选择 - 除非有人指出我有一种很好的方式来做到这一点,因为它存在。

标签: c#asp.net-mvcpagedlist

解决方案


我不会对其进行分页,而是做一些事情来显示部分数据并更新视图。

您还没有说为什么,所以我会假设在大多数情况下不会发送比对用户有用的数据更多的数据。

假设:一个类类似于:

public class ContentView 
{
   public int Id {get; set;}
   public string Content {get; set; }
   public DateTime LastEditedTime { get; set; }
}

您可以查询(我一时兴起的伪代码):

 dbContext.Books.Join(EditHistory, b => b.Id, e => e.BookId, (b,e) => new {b, e})
   .Select(new ContentView() {Id = b.Id, 
   content = b.Exceprt.Substring(0, Math.Min(b.Exceprt.Length, 100)),
   LastEditedTime = e.ModifiedTime}).ToList();

所以这里的字符串是 100 个字符。

然后在视图中有一个通过按钮(例如放大镜或椭圆)调用的方法,该方法使用 ID 调用 API / 数据库并返回全文。

如果您必须对其进行分页:

替换string content为类似于以下内容的类:

public class Content 
{
   public int Page { get; set; }
   public string BookText { get; set; }
}

然后每次单击按钮时,查询都可以获取更多数据并附加:

return db.Books.Where(w => w.Id == id)
.Select(s => new Content() {
   BookText = s.Passage.substring(page * 100, page + 1 * 100),
   Page = page++ );

或从 0 到当前页码 * 每页字符数的类似子字符串,并替换现有内容。


推荐阅读