Jqgrid undefined integer? пейджер не загружается
IM, используя jqgrids на mvc4, мне нужно получить простой список и отобразить его с помощью Ajax.
Когда я загружаю страницу, сетка запускает вызов Ajax, у меня есть только 2 столбца на сетке, user_id и имя.
Когда Json загружен, я получаю следующую ошибку на Google Chrome:
Непринятый наборщик: не удается прочитать свойство "целое число" undefined
и в firefox, firebug:
ТипError: b.jgrid.formatter undefined
на jquery.jqGrid.src.js: 122
И сетка показывает "undefined" msg, также текущий элемент управления заголовком не загружается, но данные
<table id="GridUsuarios"></table>
<div id="PagerUsuarios"></div>
<script type="text/javascript">
$(document).ready(function() {
jQuery("#GridUsuarios").jqGrid({
url: '@Url.Action("UsuariosGridData","Usuarios")',
datatype: "json",
myType: 'GET',
contentType: "application/json; charset-utf-8",
colNames: ['Usuario', 'Nombre'],
colModel: [
{ name: 'user_id', index: 'user_id', width: 90},
{ name: 'nombre', index: 'nombre', width: 200}
],
pager: '#PagerUsuarios',
rowNum: 10,
rowList: [10, 20, 30],
viewrecords: true,
height: 'auto',
sortname: 'nombre',
sortorder: 'desc',
caption: "Usuarios",
jsonReader: {
root: "rows",
total: "total",
page: "page",
records: "records",
repeatitems: false,
id: "user_id"
},
});
});
</script>
и мой контроллер:
public JsonResult UsuariosGridData(string sidx = "" , string sord = "", int page = 1, int rows = 10)
{
var resultado = db_hms.Users//.OrderByDescending(ur => ur.id_user)
.Join(db_hms.v_natural_person_short, ur => ur.id_employee, np => np.id_natural_person, (ur, np) => new { Users = ur, Natural_Person = np })//cambiar el idUser por idEmployee la relacion es alrevez XD
.Select(s => new { user_id = s.Users.id_user, nombre = s.Natural_Person.name_full })
.ToList();
int vpage = page;
int vrows = rows;
int counter = (int)Math.Ceiling((float)resultado.Count() / (float)vrows);
switch (sidx)
{
case "nombre":
{
if(sord == "desc")
{
resultado = resultado.OrderByDescending(s => s.nombre).Skip(vrows * vpage).Take(vrows).ToList();
}
else
{
resultado = resultado.OrderBy(s => s.nombre).Skip(vrows * vpage).Take(vrows).ToList(); ;
}
break;
}
case "user_id":
{
if(sord == "desc")
{
resultado = resultado.OrderByDescending(s => s.user_id).Skip(vrows * vpage).Take(vrows).ToList();
}
else
{
resultado = resultado.OrderByDescending(s => s.user_id).Skip(vrows * vpage).Take(vrows).ToList();
}
break;
}
}
var retornar = new
{
total = counter,
page = vpage,
records = vrows,
rows = resultado
};
return Json(retornar, JsonRequestBehavior.AllowGet);
}
и небольшой пример json:
{"total":101,"page":1,"records":303,
"rows":[{"user_id":"titito","nombre":"EL bonito, tito "},
{"user_id":"noro","nombre":"ElMoro, Noro "},
{"user_id":"maka","nombre":"Martinez, Macanencio "}]}
Ответы
Ответ 1
Получайте сообщение об ошибке, как правило, если один из них не содержит обязательный языковой файл grid.locale-XX.js
(например, grid.locale-en.js
) до jquery.jqGrid.min.js
или jquery.jqGrid.src.js
. См. Пример использования jqGrid в документации.
Кроме того, я бы рекомендовал вам добавить параметр gridview: true
и autoencode: true
в jqGrid, удалить несуществующий myType: 'GET'
(есть опция mtype
, значение по умолчанию, если "GET"
), уменьшить jsonReader
до jsonReader: {repeatitems: false, id: "user_id"}
, удалите все свойства index
из colModel
(потому что вы используете значения, аналогичные значениям свойства name
), и добавьте key: true
в определение столбца 'user_id'
.
Поскольку вы не реализовали подкачку данных на стороне сервера, я бы порекомендовал вам дополнительно добавить опцию loadonce: true
. Он позволяет возвращать все данные сразу из UsuariosGridData
, а jqGrid будет выполнять сортировку на стороне клиента, подкачку или опциональную фильтрацию/поиск данных.
Ответ 2
Добавьте ссылку на локальный файл jqgrid, а затем jqrid
<script src="https://cdnjs.cloudflare.com/ajax/libs/jqgrid/4.6.0/js/i18n/grid.locale-en.js"></script>
<script src="https://cdn.jsdelivr.net/jqgrid/4.6.0/jquery.jqGrid.min.js"></script>