2013-02-06 2 views
0

ByVal datax Как ObjectI'm пытается использовать ASP.NET с помощью веб-метода для извлечения данных и сохранения данных для jqgrid. Я могу получить данные с веб-метода, но не повезло сделать сохранение. Серверная сторона, похоже, никогда не получает мои данные. Кто-нибудь, пожалуйста, помогите?jqgrid webmethod: не удалось сохранить строку

код сетки:

$('#list99').jqGrid({ 
       datatype: function(postdata) { 
        $.ajax({ 
         url: 'dbtest.aspx/getdata', 
         editurl: 'dbtest.aspx/updatedb', 
         type: 'POST', 
         data: '{}', 
         dataType: "json", 
         contentType: "application/json; charset=utf-8", 
         error: function(data, textStatus) { 
          alert('Error loading json'); 
         }, 
         success: function(data, st) { 


          if (st == 'success') { 
           var grid = $("#list99"); 
           var gridData = JSON.parse(data.d); 
           grid.clearGridData(); 
           for (var i = 0; i < gridData.length; i++) { 
            grid.addRowData(i + 1, gridData[i]); 
           } 
          } 
          $("#list99").jqGrid('navGrid', '#pager99', { add: true, edit: true, del: true }); 

         } 
        }); 
       },     
       type: 'POST', 
       editurl: 'dbtest.aspx/updatedb', 
       colNames: ['customerid', 'customername'], 
       colModel: [ 
          { name: 'customerid', index: 'customerid', width: 80, align: 'left', editable: true, edittype: 'text' }, 
          { name: 'customername', index: 'customername', width: 120, align: 'left', editable: true, edittype: 'text'}], 
       pager: $('#pager99'), 
       rowNum: 5, 
       rowList: [10], 
       sortname: 'customerid', 
       sortorder: 'desc', 
       viewrecords: true, 
       //width: 300 
       autowidth: true 

}); 

стороне сервера код:

Public Class customer 

     Public customerid As String 
     Public customername As String 

    End Class 

    <System.Web.Services.WebMethod()> _ 
    Public Shared Function getdata() As String 

     Dim c1 As New customer 
     Dim c2 As New customer 
     c1.customerid = "1" 
     c1.customername = "pete" 
     c2.customerid = "2" 
     c2.customername = "joah" 
     Dim lstcustomer As New List(Of customer) 
     lstcustomer.Add(c1) 
     lstcustomer.Add(c2) 

     Dim jsonserial As New JavaScriptSerializer 
     Dim result As String 
     result = jsonserial.Serialize(lstcustomer) 

     Return result 

    End Function 

    <System.Web.Services.WebMethod()> _ 
    Public Shared Function updatedb(ByVal datax As Object) As String 

     //attempt to do save 

    End Function 

Функция updatedb просто никогда не вызывается после того, как я нажал "нажмите кнопку" после добавления/редактирования/удаления.

После этого я проверил с поджигатель и я получил сообщение об ошибке:

"Invalid web service call, missing value for parameter: 'data'." 

Я также попытался добавить следующее:

jQuery.extend(jQuery.jgrid.edit, { 
      ajaxEditOptions: { contentType: "application/json" }, 
      recreateForm: true, 
      serializeEditData: function(data) { 
       //alert('in2'); 
       //alert(postData.customerid); 
       //alert(JSON.stringify(postData)); 
       if (data.customerid == undefined) { data.customerid = null; } 
       var postData = { 'data': data }; 
       //alert(postData.customerid); 
       return JSON.stringify(postData); 
      } 
     }); 

Он по-прежнему не работал = (

+0

Вы видите, что вызов AJAX вышел? Имеет ли он данные для публикации? – Mark

+0

извините, я новичок в jquery, как я могу проверить, погас ли вызов AJAX? – user2045340

+0

Да, я проверил с firebug, и вызов AJAX вышел, однако я получил это сообщение об ошибке: – user2045340

ответ

0

Я не рекомендую вам когда-либо использовать datatype, определяемый как функция, особенно если вы используете только jQuery.ajax для связи с сервером. JqGrid предоставляет множество способов настройки данных который будет отправлен на сервер (см. serializeGridData callback и ajaxGridOptions вариант jqGrid, например) и изменить ответ сервера до того, как ответ сервера будет обработан jqGrid (например, обратный вызов). Текущий код использует addRowData для заполнения данных. Это самый медленный способ заполнить сетку, которую я знаю. Кроме того, вы вызываете navGrid при каждой загрузке данных, а не вызываете ее один раз непосредственно после создания сетки. Все остальные вызовы будут просто проигнорированы. Вы можете найти множество примеров использования веб-сервиса вместе с jqGrid. Посмотрите на the answer например

Ваш текущий код смешивает опции jQuery.ajax с the options of jqGrid. Вы поместили editurl вариант jqGrid в список опций $.ajax.

Еще одна важная ошибка заключается в использовании правильных имен переменных в методе updatedb. Вы используете в настоящее время datax As Object вместо использования customerid и customername в качестве параметров.

+0

Спасибо, спасибо за комментарий, я как-то решил проблему имя параметра «Public Shared Function updatedb» для ответа из Интернета. – user2045340

+0

Ajax get плохой, я знаю, и теперь я пытаюсь использовать url + serializegriddata + jsonreader ... но не повезло, продолжайте попробовать. – user2045340

+0

@ user2045340: Добро пожаловать! Посмотрите на код [ответ] (http://stackoverflow.com/a/6296601/315935) более внимательно. Я думаю, это показывает, как заменить 'datatype' как функцию на' datatype: "json" '. В вашем случае вы можете просто попробовать изменить свой код JavaScript, чтобы использовать 'datatype: 'json', mtype:" POST ", ajaxGridOptions: {contentType:" application/json "}, serializeGridData: function (postData) {return JSON.stringify (dataToSend); }, jsonReader: {root: "d.rows", страница: "d.page", всего: "d.total", записи: "d.records"}, loadonce: true'. Он должен работать, чтобы заполнить сетку. – Oleg

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