2014-10-01 206 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