2010-09-25 56 views
0

我能够在jqGrid上显示我的记录,但分页不工作。我总共有90条记录,即使页码增加,也总是显示前10条记录。我已经从我的方法中检查了jqGrid的返回值,它确实显示了一组不同的记录被发送到jqGrid,但jqGrid无法显示这组新记录。 以下是我的代码。请帮帮我。我需要这个紧急工作。感谢jqGrid ASP.NET MVC

public JsonResult CheckReading(int page, int rows, string sidx, string sord) 
{ 
    IList<SamplerReading> Model = 
          (IList<SamplerReading>)Session["samplerReadingArray"]; 
    int totalRecords = Model.Count + 1; 
    int pageSize = rows; 
    int pageIndex = Convert.ToInt32(page) - 1; 
    int totalPages = (int)Math.Ceiling((float)totalRecords/(float)pageSize); 

    string orderBy = string.Format("{0} {1}", sidx, sord); 

    var sales = Model.AsQueryable() 
      .OrderBy(orderBy) // Uses System.Linq.Dynamic library for sorting 
      .Skip(pageIndex * pageSize) 
      .Take(pageSize); 

    var jsonData = new 
    { 
     total = totalPages, 
     page = page, 
     records = totalRecords, 
     rows = (
       from s in Model 
       select new 
       { 
        i = s.ReadingId, 
        cell = new string[] { 
         s.SamplingDate.ToShortDateString(), 
         s.Ph.ToString(), 
         s.Ec.ToString(), 
         s.Arsenic.ToString(), 
         s.Temperature.ToString(), 
         s.OilAndGrease.ToString(), 
         s.DepthToCollar.ToString() 
        } 
       }).ToArray() 
    }; 
    return Json(jsonData); 
} 

其中

<table id="list" cellpadding="0" cellspacing="0"> 
    </table> 
    <div id="pager" style="text-align: center;"> 
    </div> 

<script type="text/javascript"> 
    var gridimgpath = '/Scripts/jqgrid/themes/redmond/images'; 
    var gridDataUrl = '/Shared/CheckReading'; 
    jQuery("#list").jqGrid({ 
     url: gridDataUrl, 
     datatype: "json", 
     mtype: 'GET', 
     colNames: ['Sampling Date', 'pH', 'EC', 'Arsenic', 'Temperature', 
        'Oil and Grease', 'Depth to Collar'], 
     colModel: [ 
      { name: 'SamplingDate', index: 'SamplingDate', width: 100, align: 'left'}, 
      { name: 'Ph', index: 'Ph', width: 30, align: 'left' }, 
      { name: 'Ec', index: 'EC', width: 30, align: 'left' }, 
      { name: 'Arsenic', index: 'Arsenic', width: 30, align: 'left' }, 
      { name: 'Temperature', index: 'Temperature', width: 30, align: 'left' }, 
      { name: 'Oil And Grease', index: 'OilAndGrease', width: 30, align:'left'}, 
      { name: 'Depth To Collar', index: 'DepthToCollar', width:30,align:'right'} 
     ], 
     rowNum: 10, 
     rowList: [10, 20, 30], 
     imgpath: gridimgpath, 
     height: 'auto', 
     width: '900', 
     pager: jQuery('#pager'), 
     sortname: 'ReadingId', 
     viewrecords: true, 
     sortorder: "desc", 
     caption: "Sampler Readings", 
     edit: true 
    }).navGrid("#pager", { edit: true, add: false, del: false }); 
</script> 
+0

有没有JavaScript错误? – queen3 2010-09-25 16:55:31

回答

1

你的代码在我看来,你的代码有一些小错误。我看到的最重要的是你应该把所有的JavaScript代码放在jQuery(document).ready(function() {/* your code */});句柄里面。

  1. totaltotalRecords应等于Model.Count和不Model.Count + 1。不需要使用Convert.ToInt32(page)。您可以直接使用page
  2. 您可以计算出totaltotalPages而不使用某些浮点运算:totalPages = (totalRecords + rows - 1)/rows。这将使相同的四舍五入。
  3. 您应该返回行数为id而不是i。所以你应该将i = s.ReadingId更换为id = s.ReadingId
  4. 直接使用sidxsord没有任何检查我发现危险。您可以允许SQL注入。例如sord很容易替换

    String.Compare(sord,“desc”,StringComparison.Ordinal)== 0? “desc”:“asc”

然后你可以确定你会在sord里面使用任何黑客。以同样的方式,您可以验证sidx作为SamplerReading的财产。在我看来,你可以使用.NET反射:typeof(SamplerReading).GetProperties()。您也可以验证sidx位于以下字符串'SamplingDate','Ph','EC','Arsenic','Temperature','OilAndGrease','DepthToCollar'的列表(数组)中,并且不使用其他值sidx

  1. 你应该把所有的JavaScript代码放在jQuery(document).ready(function() {/* your code */});句柄里面。
  2. 从jqGrid定义中,您可以从每个列定义中删除已弃用的imgpath参数和默认属性align: 'left'。 jqGrid中也没有参数edit: true
  3. 的HTML标记

可以减少

<table id="list"></table> 
<div id="pager"></div> 

你不写你使用的ASP.NET MVC的版本。可能1.0版本。对于MVC 2.0,您应该使用Json(jsonData, JsonRequestBehavior.AllowGet)

我建议你在Fiddler的Firebug中验证将向服务器发送的请求以及将发回的内容。此外,表中所有<tr>元素的ID必须是您发回的ReadingId的值。还要通过在CheckReading函数中设置断点来验证客户端是否每次从服务器获取响应,而不是从本地缓存中获取响应。

+0

你可以简单地将就绪函数设置为'$(function(){/ * your code * /});',尽管我不相信你真的需要在这种情况下使用它。事实上,有很多时候你并不需要使用ready函数。 – Ryan 2010-09-26 02:53:16

+0

@Ryan:因为'$(function()'和'jQuery(document).ready(function()'是一样的,但是如果有人忘记使用它,我总是推荐'ready'版本,做:它等待文档DOM树已**完全加载** /构造(不是一个完整的窗口与所有图像和视频)。因为jqGrid创建网格几乎只有在DOM操作的方面,它是必需的。这个改变将会解决这个问题,但它确实是非常需要的 – Oleg 2010-09-26 08:30:41

+0

嘿谢谢你的回复,我发现错误已经在哪里了,好像我没有指出正确的集合,它应该指向“销售“而不是模型在jsonData部分。 – 2010-09-27 07:03:44