2017-09-13 41 views
0

我正在嘗試使用Datatables.net實現分頁。您能否請我解釋一下下一頁按鈕的工作原理。 ATM我得到的第一頁,但顯示不能轉到下一個,服務器端我的控制器將只取得網頁的記錄(跳過&採取...)Jquery Datatables傳呼,如何進入下一頁

我的數據表:

$('#calculation-table').DataTable(
      { // set server side processing to true 
       bServerSide: true, 
       // set controller responsible for sorting and paging 
       sAjaxSource: "CalculationTest/AjaxHandler", 
       // show processing is happening while getting data 
       bProcessing: true, 
       iDisplayLength: 15, 
       lengthMenu: [[15, 25, 50, -1], [15, 25, 50, "All"]], 
       columns: [ 
        { data: "BeneficialOwner" }, 
        { data: "Account" }, 
        { data: "Country" }, 
        { data: "Currency" }, 
        { data: "Year" }, 
        { data: "Updater" } 
       ], 
       "language": { 
        "search": "", 
        "searchPlaceholder": "Search..." 
       } 
      }); 
    }); 

我的控制器:

public ActionResult AjaxHandler(JQueryDataTableParamModel param, DataTableAjaxPostModel model) 
     { 
      IEnumerable<CalculationDownloadItem> calResList; 
      int filteredRecords; 
      int totalRecords; 
      using (var serviceFactory = new ServiceFactory()) 
      { 
       var poolApi = serviceFactory.GetApiServiceCached<IPoolApi>(); 
       var mainApi = serviceFactory.GetApiServiceCached<IMainApi>(); 
       List<CalculationResult> calculationResultsList = mainApi.GetCalculationResults(BankId, param.iDisplayLength, param.iDisplayStart, out totalRecords, out filteredRecords); 
       calResList = ParseDownloadItems(calculationResultsList, poolApi, mainApi); 
       //count = mainApi.CountCalculationResults(BankId); 
      } 

      var calculationDownloadItems = calResList as CalculationDownloadItem[] ?? calResList.ToArray(); 
      return Json(new 
      { 
       sEcho = param.sEcho, 
       iTotalRecords = totalRecords, 
       iTotalDisplayRecords = filteredRecords, 
       aaData = calculationDownloadItems 
      }, 
       JsonRequestBehavior.AllowGet); 
     } 
+0

問題是您沒有使用在數據表請求中發送的分頁參數。 「JQueryDataTableParamModel」對象應該有另外兩個屬性:'iDisplayLength'和'iDisplayStart',您需要在查詢中使用它來處理分頁。 [這裏是一個例子](https://stackoverflow.com/questions/25260672/how-to-pass-value-from-controller-to-jquery-datatable)這可能有幫助(如果你使用的是LINQ) – markpsmith

回答

0

添加以下類:

public class DataTableParameters 
    { 
     public int Draw; 
     public int Length; 
     public Dictionary<int, DataTableOrder> Order; 
     public bool SearchRegex; 
     public string SearchValue; 
     public int Start; 

     private DataTableParameters() 
     { 
     } 

     /// <summary> 
     /// Retrieve DataTable parameters from WebMethod parameter, sanitized against parameter spoofing 
     /// </summary> 
     /// <param name="input"></param> 
     /// <returns></returns> 
     public static DataTableParameters Get(object input) 
     { 
      return Get(JObject.FromObject(input)); 
     } 

     /// <summary> 
     /// Retrieve DataTable parameters from JSON, sanitized against parameter spoofing 
     /// </summary> 
     /// <param name="input">JToken object</param> 
     /// <returns>parameters</returns> 
     public static DataTableParameters Get(JToken input) 
     { 
      return new DataTableParameters 
      { 
       Order = DataTableOrder.Get(input), 
       Draw = (int)input["parameters"]["draw"], 
       Start = (int)input["parameters"]["start"], 
       Length = (int)input["parameters"]["length"], 
       SearchValue = (string)input["parameters"]["search"]["value"], 
       SearchRegex = (bool)input["parameters"]["search"]["regex"] 
      }; 
     } 
    } 

    public class DataTableOrder 
    { 
     public int Column; 
     public string Direction; 

     private DataTableOrder() 
     { 
     } 

     /// <summary> 
     /// Retrieve the DataTables order dictionary from a JSON parameter list 
     /// </summary> 
     /// <param name="input">JToken object</param> 
     /// <returns>Dictionary of Order elements</returns> 
     public static Dictionary<int, DataTableOrder> Get(JToken input) 
     { 
      return (
       (JArray)input["parameters"]["order"]) 
       .Select(col => new DataTableOrder 
       { 
        Column = (int)col["column"], 
        Direction = 
         ((string)col["dir"]).StartsWith("desc", StringComparison.OrdinalIgnoreCase) ? "DESC" : "ASC" 
       }) 
       .ToDictionary(c => c.Column); 
     } 
    } 


public class DataTableResult 
    { 
     public int draw { get; set; } 
     public int recordsTotal { get; set; } 
     public int recordsFiltered { get; set; } 
     public List<CalculationDownloadItem> data { get; set; } 
    } 

然後在AjaxHandler方法中

public DataTableResult AjaxHandler(object parameters) 
     { 
      var dtparameters = DataTableParameters.Get(parameters); 

       string orderBy = getOrderColumn(Convert.ToInt32(dtparameters.Order.FirstOrDefault().Value.Column)) + " " + 
           dtparameters.Order.FirstOrDefault().Value.Direction; //Since the column returned is numeric, you should add a method to get proper order column Name and then append the direction that is returned. 
       var startIndex = dtparameters.Start > 0 ? dtparameters.Start/dtparameters.Length : 0; 
       var calculationDownloadItems=//This returns from DB 

       int TotalRecs = 0; 
       if (calculationDownloadItems.Count > 0) 
       { 
        TotalRecs = calculationDownloadItems.FirstOrDefault().CountReturnedFromDB; 
       } 
       var dtResult = new DataTableResult() 
       { 
        draw = dtparameters.Draw, 
        recordsFiltered = TotalRecs, 
        recordsTotal = TotalRecs, 
        data = calculationDownloadItems 
       }; 
       return dtResult; 
     }