2012-12-31 4 views
3

je peux faire avec succès l'appel AJAX à mon service avec le code suivant:Comment obtenir JSON à distance pour travailler avec grille Kendo dans ASP.NET

var serverData = { "ZoneParent": "123" }; 

     var request = $.ajax({ 
      type: "POST", 
      url: "/./Services/Reports.svc/getZones", 
      contentType: "application/json", 
      dataType: "json", 
      jsonp: null, 
      jsonpCallback: null, 
      data: JSON.stringify(serverData) 
     }); 


     request.done(function (msg) { 
      alert(JSON.stringify(msg)); 
     }); 

     request.fail(function (jqXHR, textStatus) { 
      alert("Request failed: " + textStatus); 
     }); 

Cependant, lorsque je tente de mettre en œuvre le même appel avec ma grille de Kendo Je reçois une erreur

Le message entrant a un format de message inattendu 'Raw'. Les formats de message attendus pour l'opération sont 'Xml', 'Json'

pour getZones. Mon appel de service fonctionne correctement avec DataTables, mais je souhaite potentiellement passer au Kendo. J'ai joué avec cela pendant des jours sans succès. L'application n'est pas MVC. Voici mon extrait de code Kendo:

var dataSource = new kendo.data.DataSource({ 

     transport: { 

      read: { 

       url: "/./Services/Reports.svc/getZones", 

       dataType: "JSON", 

       data: { zoneParent: "123" }, 

        type: "POST" 
      }, 

      parameterMap: function (data, operation) { 
        return kendo.stringify(data); 
       } 
     }, 

      schema: { 

       data: "d" 
      } 
    }); 

    var grid = $("#allGrids").kendoGrid({ 

     dataSource: dataSource, 

     height: 200 
    }); 

Répondre

5

Comme cfeduke fait la suggestion similaire, vous pouvez essayer d'ajouter contentType à l'objet de lecture du transport lu config comme vous le faisiez dans le appel $ .ajax.

par exemple.

var dataSource = new kendo.data.DataSource({ 

    transport: { 

     read: { 

      url: "/./Services/Reports.svc/getZones", 

      dataType: "json", 

      contentType: "application/json", 

      data: { zoneParent: "123" }, 

       type: "POST" 
     }, 

     parameterMap: function (data, operation) { 
       return kendo.stringify(data); 
      } 
    }, 
+0

Merci pour l'interprétation de la réponse fournie par @cfeduke. Il suffit d'ajouter contentType: "application/json" a fait l'affaire. Merci également à cfeduke. – JamesRLamar

2

Il semble que la réponse « Content-type » en-tête du serveur est autre chose que l'attendu « application/json ».

Vous pouvez utiliser cURL:

curl -v -H "Content-type:application/json" -H "Accept:application/json" \ 
http://localhost/Services/Reports.svc/getZones 

pour invoquer le point final et vérifier les valeurs d'en-tête de retour (-v est bavard, vous ne verrez pas les en-têtes sans elle). Parfois, le simple fait de définir un en-tête "Accept: application/json" est suffisant pour révéler le problème - soit le serveur force la sortie dans JSON, soit il génère une erreur qui peut être suivie.

0

J'étudie s'il y a un autre moyen de contourner cela. Mais il semble que le Kendo a beaucoup de limites et c'est l'un d'entre eux. Les données n'ont pas besoin d'en-tête, juste le format JSON.

Voici ce que vous devez ajouter à votre contrôleur qui envoie les données (en cas de son appel ajax)

d'en-tête ("Content-type: application/json");

Je souhaite que ce ne serait pas comme cela, mais le Kendo force ce que je crois. Je préfère les datatables, beaucoup plus de liberté et vous pouvez personnaliser plus.

Questions connexes