2014-10-01 326 views
2

我有一个带搜索按钮的搜索表单。当用户输入所有搜索输入字段并按下搜索按钮时,将只返回同一页面中html表格中的前10条记录。我已经做到这一点。在html表中MVC分页

当用户按下下一页按钮时,我必须保留用户输入的值并将其发送到数据库并获取下10条记录。

当我按下搜索按钮(第一个http post)时,视图模型具有用户输入的所有值,但是当我按下下一页按钮时单击(第二个帖子),视图模型不保留输入的值用户在搜索输入字段中。

我被建议不要使用临时数据将值从一个操作传递到另一个操作。有没有其他方法可以做到这一点?

+1

你能发布你的代码吗? – Gjohn 2014-10-01 20:36:30

+0

我还没有完成编码。我在找样品。 – 2014-10-01 21:25:08

回答

0

您应该尝试使用现有的支持此功能的网格,例如:Datatables

这是一个基于JQuery的网格,为您处理分页,过滤,排序等。 如果你有很多数据,甚至可以让你在服务器端检索它。请记住:“不要重新发明轮子”

+0

我没有被允许使用数据表。我们可以只使用MVC来做到这一点吗? – 2014-10-01 21:23:56

0

是的,您需要在PAGE操作中传递当前搜索参数。请记住,在ASP.NET MVC中,您需要将信息重新发布到服务器...因为它不保存状态。

如果您正在使用PagedList包,你这样做:

@Html.PagedListPager(Model.YourList, page => Url.Action("PostAction", new { page, Model.SearchString,Model.OtherFilter, sortOrder = ViewBag.CurrentSort})) 

如果没有,检查了这一点:https://github.com/troygoode/PagedList

那里你可以看到一些代码示例...但是组件可以通过Nuget进行安装。

在这里,#2你可以看到很多关于PagedList

2

问题/答案你有没有考虑PagedList库分页的?所有你要做的就是引用ASP.NET MVC应用程序中的PagedList库

要安装PagedList.Mvc,请在程序包管理器控制台中运行以下命令。你也可以使用NuGet来获取这个包。

PM> Install-Package PagedList.Mvc 

您的视图模型

public class QuestionViewModel 
{ 
     public int QuestionId { get; set; } 
     public string QuestionName { get; set; } 
} 

在你的控制器,参考PagedList

using PagedList; 
and the Index method of your controller will be something like 

public ActionResult Index(int? page) 
{ 
      var questions = new[] { 
       new QuestionViewModel { QuestionId = 1, QuestionName = "Question 1" }, 
       new QuestionViewModel { QuestionId = 1, QuestionName = "Question 2" }, 
       new QuestionViewModel { QuestionId = 1, QuestionName = "Question 3" }, 
       new QuestionViewModel { QuestionId = 1, QuestionName = "Question 4" } 
      }; 

      int pageSize = 3; 
      int pageNumber = (page ?? 1); 
      return View(questions.ToPagedList(pageNumber, pageSize)); 
} 

而且你的索引视图

@model PagedList.IPagedList<ViewModel.QuestionViewModel> 
@using PagedList.Mvc; 
<link href="/Content/PagedList.css" rel="stylesheet" type="text/css" /> 


<table> 

@foreach (var item in Model) { 
    <tr> 
     <td> 
      @Html.DisplayFor(modelItem => item.QuestionId) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.QuestionName) 
     </td> 
    </tr> 
} 

</table> 

<br /> 

Page @(Model.PageCount < Model.PageNumber ? 0 : Model.PageNumber) of @Model.PageCount 
@Html.PagedListPager(Model, page => Url.Action("Index", new { page })) 

而且所得到的屏幕看起来像

enter image description here

+0

当我得到结果时,我将获得百万条记录。在你的例如。 'var question ='我无法将百万条记录绑定到这个变量。当我按第二页时,我必须再次调用数据库并获得第二组记录。存储过程将负责返回第二组记录。但是当我按下第二页按钮时,我传递了相同的搜索输入值。 – 2014-10-01 22:24:28

+0

然后你必须编写你自己的自定义代码来做到这一点,它不应该那么困难。如果搜索输入值在点击下一页按钮时丢失了,那么我想你会在某处重置视图模型值。如果您使用强类型视图的视图模型,那么除非您重新初始化vm类,否则它应该保留输入值。 – 2014-10-01 22:41:32

+0

@SaravananGengan ...如果你不做一个“.ToList()”你的查询不在数据库中执行。所以......只有当你执行questions.ToPagedList(1,20)时才会执行它。所以,该列表将只有20条记录。试试这个...并检查是否需要其他解决方案。 – Romias 2014-10-02 01:10:27