2013-08-09 1 views
4

Так что я бил головой о стену в течение дня или около того, пытаясь заставить это работать. если это просто и глупо - извините и спасибо. Это довольно длинный пост, поскольку я пытаюсь описать все, что я сделал до сих пор.KendoUI DataSource приводит к недопустимому примитиву JSON

Итак, у меня есть веб-сервис ASMX, который я бы хотел использовать для заполнения списка Kendo UI. Это отлично работает, пока я не добавлю данные: к моему транспортному запросу. Так что мой веб-сервис будет выглядеть так:

WebMethod(Description = "Return All Pending Actions Based")] 
[ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
public PendingActionResult GetPendingActions(string sUsername, string sPassword, string sUserID, string sClubID) 
{ 
    //code is here; 
} 

И мое полное DataSource выглядит следующим образом:

dataSource = new kendo.data.DataSource({ 
       transport: { 
        read: { 
         type: "POST", 
         data: "{'sUsername':'[email protected]','sPassword':'13123','sUserID':'1539','sClubID':'1'}", 
         url: "http://sdk.domain.com/services/general.asmx/GetPendingActions", 
         contentType: "application/json; charset=utf-8", 
         dataType: "json" 
        } 
       }, 
       schema: { 
         data: "d.Data", // ASMX services return JSON in the following format { "d": <result> }. Specify how to get the result. 
         total: "d.Total", 
         model: { 
          id: "activityID", 
          fields: { 
           activityID: { type: "number", validation: {min: 1, required: true } }, 
           taskName: { type: "string" }, 
           taskNote: { type: "string" }, 
           openDate: { type: "datetime" }, 
           dueDate: { type: "datetime" }, 
           priority: { type: "number" }, 
           statusID: { type: "number" }, 
           openedByID: { type: "number" }, 
           assignedToID: { type: "number" }, 
           statusName: { type: "string" }, 
           complete: { type: "bool" } 
          } 
         } 
        } 
      }); 

      that.set("pendingActionsDataSource", dataSource); 

Я получаю ошибку Спинка:

{ "Сообщение":» InvalidJSONprimitive: "\ u00261 = {\ u00262 = \ u0027 \ u00263 = s \ u00264 = U \ u00265 = s \ u00266 = е \ u00267 = г \ u00268 = п \ u00269 = а \ u002610 = т \ u002611 = е \ u002612 = \ u0027 \ u002613 =: \ u002614 = \ u0027 \ u002615 = а \ u002616 = d \ u002617 = т \ u002618 = я \ u002619 = п \ u002620 = @ \ u002621 = т \ u002622 = а \ u002623 = я \ u002624 = л \ U002 625 =. \ U002626 = с \ u002627 = о \ u002628 = т \ u002629 = \ u0027 \ u002630 = \ u002631 = \ u0027 \ u002632 = s \ u002633 = Р \ u002634 = а \ u002635 = s \ u002636 = s \ u002637 = ш \ u002638 = о \ u002639 = г \ u002640 = d \ u002641 = \ u0027 \ u002642 =: \ u002643 = \ u0027 \ u002644 = 1 \ u002645 = 3 \ u002646 = 1 \ u002647 = 2 \ u002648 = 3 \ u002649 = \ u0027 \ u002650 = \ u002651 = \ u0027 \ u002652 = s \ u002653 = U \ u002654 = s \ u002655 = е \ u002656 = г \ u002657 = I \ u002658 = D \ u002659 = \ u0027 \ u002660 =: \ u002661 = \ u0027 \ u002662 = 1 \ u002663 = 5 \ u002664 = 3 \ u002665 = 9 \ u002666 = \ u0027 \ u002667 = \ u002668 = \ u0027 \ u002669 = s \ u002670 = С \ u002671 = L \ u002672 = и \ u002673 = Ь \ u002674 = I \ u002675 = D \ u002676 = \ u0027 \ u002677 =: " "\ u002678 = \ u0027 \ u002679 = 1 \ u002680 = \ u0027 \ u002681 =} \ u002682 =" StackTrace" : "atSystem.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize (Stringinput, Int32depthLimit, JavaScriptSerializerserializer) \ г \ natSystem.Web.Script.Serialization.JavaScriptSerializer.DeserializeT \ г \ natSystem.Web.Script.Services.RestHandler.ExecuteWebServiceCall (HttpContextcontext , WebServiceMethodDatamethodData) "" ExceptionType «:» System.ArgumentException «}

Так что я начал искать высокие и низкие за все, что было похоже, и нашел другие люди пропуская ни" или»в запросе данных, так что я пытался тоннами различных вариаций него , попытался использовать JSON.stringify, но ошибка продолжалась. Поэтому я пошел к скрипачу, чтобы посмотреть, что отправляется на сервер, и вот моя проблема. Отправляется Junk. Скрипач показывает это в TextView отправляется на сервер:

0=%7B&1='&2=s&3=U&4=s&5=e&6=r&7=n&8=a&9=m&10=e&11='&12=%3A&13='&14=a&15=d&16=m&17=i&18=n&19=%40&20=m&21=a&22=i&23=l&24=.&25=c&26=o&27=m&28='&29=%2C&30='&31=s&32=P&33=a&34=s&35=s&36=w&37=o&38=r&39=d&40='&41=%3A&42='&43=1&44=3&45=1&46=2&47=3&48='&49=%2C&50='&51=s&52=U&53=s&54=e&55=r&56=I&57=D&58='&59=%3A&60='&61=1&62=5&63=3&64=9&65='&66=%2C&67='&68=s&69=C&70=l&71=u&72=b&73=I&74=D&75='&76=%3A&77='&78=1&79='&80=%7D 

(я выложу картину онлайн этого, так что это немного легче увидеть)

Так вот я могу ясно видеть, что строка ISN 't отправляется в правильном формате. Поэтому я решил оставить это без использования Kendo dataSource, но вместо этого просто использовать JSON/AJAX. Так что я напечатал это вверх:

function getPAs() { 
    $.ajax({ 
    type: "POST", 
    url: "http://sdk.domain.com/services/general.asmx/GetPendingActions", 
    data: "{'sUsername':'[email protected]','sPassword':'13123','sUserID':'1539','sClubID':'1'}", 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    success: getPAs_Success, 
    error: app.onError 
    }); 
} 

function getPAs_Success(data, status) { 
    console.log("START getPAs_Success"); 

    var cars = data.d; 
    var sout = document.getElementById('nav'); 
    var output = ""; 
    $.each(cars, function(index, car) { 
    output += '<p><strong>' + car.taskName + ' ' + 
          car.taskNote + '</strong><br /> Priority: ' + 
          car.priority + '<br />Status: ' + 
          car.statusID + '<br />Opened By: ' + 
          car.openedByID + '<br />Assigned To' + 
          car.assignedToID + '</p>'; 
    }); 
    sout.innerHTML = output; 
    console.log("END getPAs_Success"); 
} 

И если я смотрю на скрипача в TextView я вижу это посылается на сервер:

{'sUsername':'[email protected]','sPassword':'13123','sUserID':'1539','sClubID':'1'} 

И я ясно вижу, мои результаты JSON в стельку, а также.

Так что мой вопрос после того, как все, что:

Есть ли что-то особенное я должен делать с Кендо UI Datasource для того, чтобы осуществить это? Если это имеет значение, я использую Icenium и пытаюсь создать быстрое мобильное приложение для удовольствия.

Спасибо,

Ричард

UPDATE # 1 Пытался как и дальше.

данные: { "sUsername": "[email protected]", "sPassword": "13123", "sUserID": "1539", "sClubID": "1"},

, который проверяет используя jsonlint.com, но когда я смотрю на скрипача теперь я вижу, это отправляется на сервер:

sUsername = админ% 40mail.com & sPassword = 13123 & sUserID = 1539 & sClubID = 1

Так может быть, это потому что сейчас у меня нет котировок вокруг данных, поэтому я пробовал это:

данные: { "sUsername": "[email protected]", "sPassword": "13123", "sUserID": "1539", "sClubID": "1"} ',

и когда Я делаю то, что я получаю такой же беспорядок 0 =% 7 ... как и выше.

Когда я пытаюсь использовать toJSON, я получаю функцию объекта без метода. Делая что-то вроде этого:

var jsPost = $.toJSON({ 
       sUsername: "[email protected]", 
       sPassword: "13123", 
       sUserID: "1539", 
       sClubID: "1" 
      }); 

Найдено кто на Telerik форумах, которые сказали не использовать toJSON и вместо того, чтобы использовать JSON.stringify поэтому я попытался это:

var jsPost = { 
       sUsername: "[email protected]", 
       sPassword: "13123", 
       sUserID: "1539", 
       sClubID: "1" 
      }; 

...

data: JSON.stringify(jsPost), 

Но все же результат сумасшедшего мусора.

+0

Вы когда-нибудь получали ответ здесь или от Telerik, который не включает в себя вложенный вызов $ .ajax? Я делаю то же самое. Спасибо за обходное решение. –

ответ

0

Для действительного формата JSON нужны двойные кавычки, а не одиночные. Вы можете попробовать проверить свою строку в таких сервисах, как http://jsonlint.com/. Еще лучше, вы можете использовать toJson на объекте, а не строить его вручную.