2015-09-17 3 views
1

Я пытаюсь создать jqGrid с MVC4 WebApi. Я просмотрел различные примеры и, наконец, использовал этот link в качестве ссылки. Проблема заключается в том, что сетка не заполняется данными, но она удаляет GET-метод сервера (контрольная точка останова для тестирования). Я разместил приложение на локальном IIS. Ниже jqgrid страница (index.htm)JQGrid Не заселяющие данные. (Всегда пустая сетка)

<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
    <meta http-equiv="X-UA-Compatible" content="IE=edge" /> 
    <title>My First Grid</title> 
    <link href="../Content/jquery.jqGrid/ui.jqgrid.css" type="text/css" rel="stylesheet" /> 
    <style> 
     html, body { 
      font-size: 75%; 
     } 
    </style> 
    <script src="../Scripts/jquery-1.9.1.min.js" type="text/javascript"></script> 
    <script src="../Scripts/jquery-ui-1.10.4.js" type="text/javascript"></script> 
    <script src="../Scripts/i18n/grid.locale-en.js" type="text/javascript"></script> 
    <script src="../Scripts/jquery.jqGrid.js" type="text/javascript"></script> 

    <script type="text/javascript"> 
     $(document).ready(function() { 
      var API_URL = "/WebApiOne/api/task/"; 
      jQuery("#gridMain").jqGrid({ 
       url: API_URL, 
       data : API_URL, 
       datatype: 'json', 
       contentType: "application/json; charset=UTF-8", 
       mtype: 'GET', 
       pager: '#pagernav', 
       sortable: true, 
       height: 200, 
       viewrecords: true, 
       colNames: ['TaskID', 'ProjectID', 'ProjectName', 'TaskName', 'TaskStatus'], 
       colModel: [{ name: 'TaskID', index: 'TaskID', width: 40, sorttype: "int" }, 
       { name: 'ProjectID', index: 'ProjectID', editable: true, edittype: 'int', width: 70 }, 
       { name: 'ProjectName', index: 'ProjectName', editable: true, edittype: 'text', width: 70 }, 
       { name: 'TaskName', index: 'TaskName', editable: true, edittype: 'text', width: 50, align: "right" }, 
       { name: 'TaskStatus', index: 'TaskStatus', editable: true, edittype: 'text', width: 50, align: "right"} 
       ], 
       caption: "CRUD With ASP.NET Web API", 
       autowidth: true 
      }); 
     }); 
    </script> 
</head> 
<body> 

    <table id="gridMain"> 
    </table> 
    <div id="pagernav"> 
    </div> 
</body> 
</html> 

Вот мой Server Side Код:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Net; 
using System.Net.Http; 
using System.Web.Http; 

namespace WebApiOne.Controllers 
{ 
    public class Task 
    { 
     public int TaskID { get; set; } 
     public int ProjectID { get; set; } 
     public string ProjectName { get; set; } 
     public string TaskName { get; set; } 
     public string TaskStatus { get; set; } 
    } 

    public class TaskController : ApiController 
    { 
     // GET api/task 
     public IEnumerable<Task> Get() 
     { 
      Task[] tasks = new Task[2]; 

      tasks[0] = new Task() 
      { 
       TaskID = 1, 
       ProjectID = 1, 
       ProjectName = "ProjectOne", 
       TaskName = "FirstPage Development", 
       TaskStatus = "InProgress" 

      }; 

      tasks[1] = new Task() 
      { 
       TaskID = 2, 
       ProjectID = 1, 
       ProjectName = "ProjectOne", 
       TaskName = "Second Page Development", 
       TaskStatus = "Yet To Start" 

      }; 

      return tasks; 
     } 

     // GET api/task/5 
     public string Get(int id) 
     { 
      return "value"; 
     } 

     // POST api/task 
     public void Post([FromBody]string value) 
     { 
     } 

     // PUT api/task/5 
     public void Put(int id, [FromBody]string value) 
     { 
     } 

     // DELETE api/task/5 
     public void Delete(int id) 
     { 
     } 
    } 
} 

Но когда я просматриваю для локального хоста/WebApiOne/API/задач/Я получаю исходные данные в формате JSON as: [{"TaskID":1,"ProjectID":1,"ProjectName":"ProjectOne","TaskName":"FirstPage Development","TaskStatus":"InProgress"},{"TaskID":2,"ProjectID":1,"ProjectName":"ProjectOne","TaskName":"Second Page Development","TaskStatus":"Yet To Start"}]

Это доказывает, что Сервер функционирует, и я ничего не теряю на переднем конце.

+0

Какую версию jqGrid вы используете? Значение 'TaskID' отличается во всех элементах, возвращаемых' WebApiOne/api/task/'(может ли' TaskID' использоваться как rowid)? – Oleg

+0

версия - @license jqGrid 4.4.4 - jQuery Grid –

+0

Да .. TaskID отличается во всех элементах, возвращаемых 'WebApiOne/api/task /' –

ответ

1

Я рекомендую вам не использовать старые версии jqGrid как версия 4.4.4, опубликованной еще в 2,5 года назад. Я бы рекомендовал вам использовать текущую версию (4.9.2) от free jqGrid. Если вы предпочитаете использовать NuGet, вы можете использовать Install-Package free-jqGrid для установки текущей версии бесплатного jqGrid (см. here). См. the wiki и прочитайте каждую опубликованную версию для получения дополнительной информации.

Некоторые изменения могут быть использованы независимо от версии jqGrid:

  • data : API_URL должен быть удален, если вы используете datatype: 'json'.
  • contentType является опцией jQuery.ajax. Если вам нужно установить его в jqGrid, вы должны использовать ajaxGridOptions: {contentType: "application/json; charset=UTF-8"}.
  • Если вы используете старую версию jqGrid, тогда вам нужно добавить jsonReader в форму jsonReader: {repeatitems: false, root: function (obj) { return obj; }}. Если вы используете бесплатный jqGrid, то он автоматически обнаружит структуру вашего currect ответа JSON и не потребуется jsonReader.
  • Вы должны добавить опцию loadonce: true, если вы планируете не реализовывать пейджинг на стороне сервера и сортировку данных. Вы должны вернуть все данные, и один раз и jqGrid будет выполнять сортировку, подкачку и фильтрацию на стороне клиента.
  • Если вы используете старую версию jqGrid, вы должны добавить gridview: true, чтобы улучшить производительность. Free jqGrid использует этот параметр по умолчанию.
  • Я бы рекомендовал использовать height: "auto" вместо height: 200, но лучший выбор зависит от ваших точных требований.
  • Вы должны добавить опцию autoencode: true, если данные, возвращаемые с сервера, являются чистыми данными, а не фрагментами HTML для ячеек.
  • Я рекомендую удалить ненужные index свойства от colModel и значения со значениями по умолчанию (edittype: 'text').
  • Вы должны добавить key: true property to TaskID column.Входные данные имеют значение содержит информацию о rowid. Чтобы иметь возможность редактировать данные, вы должны использовать правильные значения rowid.
  • Если вы используете бесплатный jqGrid, то вы можете удалить <div id="pagernav"></div> и заменить pager: '#pagernav' на pager: true. Бесплатный jqGrid может автоматически создать требуемый <div> для пейджера.

ОБНОВЛЕНО: код сервера может быть изменен, чтобы следующий, например:

using System.Collections.Generic; 
using System.Web.Http; 

namespace WebApiOne.Controllers 
{ 
    public class Task 
    { 
     public int TaskID { get; set; } 
     public int ProjectID { get; set; } 
     public string ProjectName { get; set; } 
     public string TaskName { get; set; } 
     public string TaskStatus { get; set; } 
    } 

    public class TaskController : ApiController 
    { 
     // GET api/task 
     public IEnumerable<Task> Get() { 
      Task[] tasks = { 
       new Task { 
        TaskID = 1, 
        ProjectID = 1, 
        ProjectName = "ProjectOne", 
        TaskName = "FirstPage Development", 
        TaskStatus = "InProgress" 
       }, 
       new Task { 
        TaskID = 2, 
        ProjectID = 1, 
        ProjectName = "ProjectOne", 
        TaskName = "Second Page Development", 
        TaskStatus = "Yet To Start" 

       } 
      }; 
      return tasks; 
     } 

     // GET api/task/5 
     public string Get(int id) 
     { 
      return "value"; 
     } 

     // POST api/task 
     public void Post ([FromBody]Task task) 
     { 
      //perform new Row Add to DB 
      // task.TaskID will be 0 here 
     } 

     // PUT api/task/5 
     public void Put (int id, [FromBody]Task task) 
     { 
      //perform Db Update 
      // task.TaskID and id are identical 
     } 

     // DELETE api/task/5 
     public void Delete (int id) 
     { 
      // Delete row in DB. 
     } 
    } 
} 

клиентский код может быть

$(document).ready(function() { 
    "use strict"; 
    var apiUrl = "/WebApiOne/api/task/"; 
    jQuery("#gridMain").jqGrid({ 
     url: apiUrl, 
     editurl: apiUrl, 
     datatype: "json", 
     gridview: true, 
     height: "auto", 
     iconSet: "fontAwesome", 
     autoencode: true, 
     sortable: true, 
     viewrecords: true, 
     loadonce: true, 
     prmNames: { id: "TaskID" }, 
     colNames: ["TaskID", "ProjectID", "ProjectName", "TaskName", "TaskStatus"], 
     colModel: [ 
      { name: "TaskID", width: 60, key: true, editable: false, sorttype: "int" }, 
      { name: "ProjectID", width: 90 }, 
      { name: "ProjectName", width: 190 }, 
      { name: "TaskName", width: 170, align: "right" }, 
      { name: "TaskStatus", width: 170, align: "right" } 
     ], 
     cmTemplate: { editable: true }, 
     //autowidth: true, 
     formEditing: { 
      width: 400, 
      reloadGridOptions: { fromServer: true }, 
      serializeEditData: function (postdata) { 
       var copyOfPostdata = $.extend({}, postdata); 
       if (postdata.TaskID === "_empty") { // ADD operation 
        postdata.TaskID = 0; // to be easy to deserialize 
       } 
       delete copyOfPostdata.oper; // remove unneeded oper parameter 
       return copyOfPostdata; 
      } 
     }, 
     formDeleting: { 
      mtype: "DELETE", 
      reloadGridOptions: { fromServer: true }, 
      serializeDelData: function() { 
       return ""; // don't send and body for the HTTP DELETE 
      }, 
      onclickSubmit: function (options, postdata) { 
       //var p = $(this).jqGrid("getGridParam"); // get reference to internal parameters 
       //p.datatype = "json"; 
       options.url = apiUrl + encodeURIComponent(postdata[0]); 
      } 
     }, 
     pager: true 
    }).jqGrid("navGrid", {}, { 
     mtype: "PUT", 
     onclickSubmit: function (options, postdata) { 
      //var p = $(this).jqGrid("getGridParam"); // get reference to internal parameters 
      //p.datatype = "json"; // reset datatype to reload from the server 
      options.url = apiUrl + encodeURIComponent(postdata[this.id + "_id"]); 
     } 
    }).jqGrid("filterToolbar") // add searching toolbar for local sorting (bacsue of loadonce:true) in the grid 
     .jqGrid("gridResize"); 
}); 

Приведенный выше код использует free jqGrid с Font Awesome. Соответствующий демонстрационный проект можно загрузить с here. Вы должны установить точки останова внутри кода сервера и использовать Fiddler, чтобы увидеть, что все запросы работают так, как ожидалось. Код сервера должен реализовывать delete/edit/add в базе данных причины. Важно понимать, что демо основано на вашем исходном коде и не изменяет никаких данных в базе данных. После редактирования данные будут перезагружены с сервера, чтобы убедиться, что один из них использует последний идентификатор данных и сервера после добавления. Поскольку данные не будут сохранены в базе данных или изменены на сервере, данные будут отображаться без изменений в сетке после загрузки. Это означает, что код сервера необходимо расширить для поддержки изменений данных. Я хотел просто показать, как настроить клиентскую часть (jqGrid) для отправки правильных запросов на сервер.

+0

Я пробовал все изменения, которые вы рекомендовали, обновит вас через некоторое время и спасибо для устрашающего ответа (полностью разработан) –

+0

Я изменил 'repeatitems' на false в' jsonReader: {repeatitems: true, root: function (obj) {return obj; }} 'в соответствии с ответом, отправленным вами по ссылке - http://stackoverflow.com/questions/3213984/jqgrid-giving-exception-when-json-is-attempted-to-be-loaded –

+0

Это сработало !!! СПАСИБО: D. Стек мешает мне проголосовать более 1 раза. В противном случае я бы поддержал его до 100. Великий САЛЮТ вам :) –

0

Добавить ниже код в вашем определении jqGrid

jsonReader : { 
 
    repeatitems: false 
 
},

+0

не работал: (Любые другие предложения? –

+0

Он должен работать. Попробуйте ввести код в своем действии.Сначала измените тип возврата для вашего действия на JsonResult и добавьте ниже код. 'return Json (tasks, JsonRequestBehavior.AllowGet);' –

+0

'return Json (tasks, JsonRequestBehavior.AllowGet);' имеет некоторые синтаксические ошибки –

Смежные вопросы