jqGrid ASP.NET MVC - PullRequest
       12

jqGrid ASP.NET MVC

0 голосов
/ 25 сентября 2010

Я могу отображать свои записи на jqGrid, однако подкачка не работает.Всего у меня 90 записей, и всегда отображаются первые 10 записей, хотя номер страницы действительно увеличивался.Я проверил возвращаемые значения в jqGrid из моего метода, и он действительно показал другой набор записей, отправляемых в jqGrid, но jqGrid не может отобразить этот новый набор записей.

Ниже приведен мой код.

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>

1 Ответ

1 голос
/ 25 сентября 2010

Мне кажется, ваш код содержит небольшие ошибки.Самое важное, что я вижу, это то, что вы должны поместить весь код JavaScript в дескриптор jQuery(document).ready(function() {/* your code */});.

  1. total или totalRecords должно быть равно Model.Count, а не Model.Count + 1.
  2. Использование Convert.ToInt32(page) не требуется.Вы можете просто использовать page direct.
  3. Вы можете вычислить total или totalPages без использования некоторой арифметики с плавающей точкой: totalPages = (totalRecords + rows - 1) / rows.Это сделает такое же округление.
  4. Вы должны вернуть строки, имеющие id, а не i.Поэтому вы должны заменить i = s.ReadingId на id = s.ReadingId
  5. Использование sidx и sord напрямую без какой-либо проверки, я считаю опасным.В пути вы можете разрешить SQL-инъекцию.Заменить sord очень просто, например,

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

, тогда вы можете быть уверены, что не будете использовать хаки внутри sord.Таким же образом вы можете проверить sidx как свойство SamplerReading.Мне кажется, что вы можете использовать .NET Reflection: typeof(SamplerReading).GetProperties().Вместо этого вы также можете проверить, что sidx находится в списке (массиве) следующих строк 'SamplingDate','Ph','EC','Arsenic','Temperature','OilAndGrease','DepthToCollar' и не использовать никакого другого значения sidx.

  1. Вы должны поместить весь код JavaScript внутрииз jQuery(document).ready(function() {/* your code */}); handle.
  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> элементов таблицы должны быть значениями ReadingId, которые вы отправляете обратно.Также проверьте, установив точки останова в функции CheckReading, чтобы клиент каждый раз получал ответ от сервера, а не из локального кэша.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...