0

ajax スクリプトから ASP.Net Web サービスにフォーム データを渡し、応答として JSON オブジェクトを受け取ることができ、うまく機能します。JQ Grid で同じパラメーターを使用して同じ呼び出しを行うと、「無効な Web サービス呼び出し」または「無効な JSON プリミティブ」という応答が返されます。

これは次の投稿にかなり近いと思います。推奨事項 (および他の多くの投稿の推奨事項) を適用しましたが、成功しませんでした。 JQGrid - ASP.NET WebMethod を呼び出すことはできませんが、Ajax を使用することはできます

次の Ajax コードは成功です。フォーム パラメーターを Web サービスに渡し、結果を JSON 形式で取得します。

Ajax Javascript コード: このコードは機能します。問題は JQ Grid (以下)です。

<script language="JavaScript">
    function populateResults() {
    var arForm = $("#searchForm").serializeArray();

    $.ajax({
      type: "POST",
      url: "./WebService/Service.asmx/doSearch",
      data: JSON.stringify({ formVars: arForm }),
      contentType: "application/json",
      dataFilter: function(data) {
        var msg = eval('(' + data + ')');
        if (msg.hasOwnProperty('d'))
          return msg.d;
        else
          return msg;
      },
      success: function(msg) {
        // This will now output the same thing 
        //  across any current version of .NET.
        //console.log(msg.foo);
      }
    });
    };

    </script>

ウェブサービス:

[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public string doSearch(NameValue[] formVars)
{...

問題: 以下は、失敗する私の JQ Grid コードです。

<script type="text/javascript">
    function populateResults() {
        var arForm = $("#searchForm").serializeArray(); 
        var searchParams = JSON.stringify({ formVars: arForm });

        var grid = $("#tblResults");
        grid.jqGrid({
            url: "./WebService/Service.asmx/doSearch",
            ajaxGridOptions: { contentType: 'application/json; charset=utf-8' },
            data: searchParams,
            dataType: 'json',
            dataFilter: function(data) {
                var msg = eval('(' + data + ')');
                alert(msg.d);

                if (msg.hasOwnProperty('d'))
                  return msg.d;
                else
                  return msg;
            },
            mtype: 'POST',
            colNames:['Exam Date','Type','Name','UR Number','Pathology Type','Result Date','Modality', 'Results'],
            colModel:[
                {name:'resExamDate',index:'resExamDate', editable:false, width:120},
                {name:'resType',index:'resType', editable:false, width:60},
                {name:'name',index:'name', editable:false, width:120},
                {name:'urnumber',index:'urnumber', width:65, sorttype:'int'},
                {name:'resPathologyType',index:'resPathologyType', editable:false, width:120},
                {name:'resResultDate',index:'resResultDate', editable:false, width:120},
                {name:'resModality',index:'resModality', editable:false, width:170, cellattr: function (rowId, tv, rawObject, cm, rdata) { return 'style="white-space: normal;"'}},
                {name:'results',index:'results', editable:false, width:240, cellattr: function (rowId, tv, rawObject, cm, rdata) { return 'style="white-space: normal;"'}}
            ],
            rowNum:10,
            rowList:[5,10,20],
            pager: '#pager',
            sortname: 'surname',
            viewrecords: true,
            sortorder: "desc",
            height: "100%",
            processData: false,  //jquery will stringify again apparently: https://stackoverflow.com/questions/6471759/invalid-web-service-call-missing-value-for-parameter
            serializeGridData: function (postData) { return JSON.stringify(postData);   },
            jsonReader: { 
                total: "total",
                page: "page",
                records: "records",
                root: "rows",
                id: "id",
                cell: "cell",
                repeatitems: false
            }
        });
    }
    </script>

Firebug では、次の情報を受け取ります。

Post
{"_search":false,"nd":1338180778103,"rows":10,"page":1,"sidx":"surname","sord":"desc"}

Response
{"Message":"Invalid web service call, missing value for parameter: \u0027formVars\u0027.","StackTrace":"   at System.Web.Script.Services.WebServiceMethodData.CallMethod(Object target, IDictionary`2 parameters)\r\n

または、「serializeGridData:」行をコメント アウトすると (2 回シリアル化していると思うので、コメント アウトしてみました)、次のようになります。

Post:
    _search=false&nd=1338180203206&rows=10&page=1&sidx=surname&sord=desc

Response:
    {"Message":"Invalid JSON primitive: _search.","StackTrace":"   at System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializePrimitiveObject()\r\n ......

なぜそれが機能しないのかについての確固たるアイデアはありますか? 私はこれをこのように機能させるために何日も費やしました。Ajax 呼び出しを実行してデータを変数に格納し、それを JQ Grid に設定することで機能させることができますが、フィルタリングなどのために JQ GRid から直接 Web サービスを呼び出す必要があります...

前もって感謝します :)

編集: - JQ Grid v4.3.2 を使用 - Web サービスに送信される JSON データは、http://jsonlint.com/ を使用して検証されています(これは、上記の JavaScript コードの変数「searchParams」です)。

4

3 に答える 3

2

通話の中で使用するもの{}( を参照)/*here*/

grid.jqGrid({/*here*/});

jqGridパラメータまたはjqGrid オプションです。dataFilterjqGrid はオプションを無視するだけなので、ここで使用するのは間違っています。同様に、jqGrid はdataTypeオプションを認識せず、無視しdataType: 'json'ます。datatype(大文字と小文字に注意してください)のデフォルト値は です'xml'。サーバーからの JSON 応答が間違った XML ファイルであるため、エラーが発生します。

同様dataに、jqGrid のパラメーターは別の方法で使用されます。postData代わりにパラメーターを使用する必要があります。grid.jqGrid({/*here*/}); onceのようなコードで jqGrid を作成する必要があることを理解することが重要です。したがって、データのページング、並べ替え、またはフィルター処理で、フォームからの現在の値がサーバーに送信されるようにする場合は、 functionとして"#searchForm"定義する必要があります。詳細については、回答を参照してください。使用すると、コールバック内にプロパティを追加するのがおそらく簡単になります。formVarsmtype: 'POST'formVarsserializeGridData

したがって、現在のコードを次のように書き換える必要があります。

$(function () {
    var grid = $("#tblResults");
    grid.jqGrid({
        url: "./WebService/Service.asmx/doSearch",
        ajaxGridOptions: { contentType: 'application/json; charset=utf-8' },
        serializeGridData: function (postData) {
            // extend the parameter which will be send to the server
            postData.formVars = $("#searchForm").serializeArray();
            // serialize the parameters as JSON string
            return JSON.stringify(postData);
        },
        datatype: 'json',
        mtype: 'POST',
        colNames:['Exam Date','Type','Name','UR Number','Pathology Type','Result Date','Modality', 'Results'],
        colModel:[
            {name:'resExamDate',index:'resExamDate', width:120},
            {name:'resType',index:'resType', width:60},
            {name:'name',index:'name', width:120},
            {name:'urnumber',index:'urnumber', width:65},
            {name:'resPathologyType',index:'resPathologyType', width:120},
            {name:'resResultDate',index:'resResultDate', width:120},
            {name:'resModality',index:'resModality', width:170,
                cellattr: function () {
                    return ' style="white-space: normal;"'
                }},
            {name:'results',index:'results', width:240,
                cellattr: function () {
                    return ' style="white-space: normal;"'
                }}
        ],
        rowNum: 10,
        rowList: [5, 10, 20],
        pager: '#pager',
        sortname: 'surname',
        viewrecords: true,
        sortorder: "desc",
        height: "100%",
        jsonReader: {
            root: function (obj) { return obj.d; },
            page: function () { return 1; },
            total: function () { return 1; },
            records: function (obj) { return obj.d.length; }
        }
    });
});

さらに、サーバー部分がデータのページングを実装していないようです。すべての標準 jqGrid パラメーター ( rowspagesidx、 ) を無視する場合は、たとえば、削除やその他のページャー情報 (ドキュメントを参照)sordの値を増やすように設定する必要がありrowNumます。さらに、使用できますrowNum: 10000rowListpgbuttons: false, pginput: false

serializeGridData: function () {
    return JSON.stringify({formVars: $("#searchForm").serializeArray()});
}

この場合、jqGrid はサーバーにのみ送信formVarsします。

于 2012-05-28T10:39:48.960 に答える
0

次のようなWebサービスの予想されるパラメーター名を含める必要があります

var grid = $("#tblResults");
        grid.jqGrid({
            url: "./WebService/Service.asmx/doSearch",
            ajaxGridOptions: { contentType: 'application/json; charset=utf-8' },
            data:{u0027formVars: searchParams},

入力パラメーター名が含まれていたため、前のコードは成功しました

于 2012-05-28T05:18:42.767 に答える
0

次のようにデータを渡す必要があります。

function populateResults() {
var arForm = $("#searchForm").serializeArray();
var formvars = JSON.stringify(arForm);

$.ajax({
  type: "POST",
  url: "./WebService/Service.asmx/doSearch",
  data: "{'formVars':'" + formvars + "'}",
  contentType: "application/json",
  dataFilter: function(data) {
    var msg = eval('(' + data + ')');
    if (msg.hasOwnProperty('d'))
      return msg.d;
    else
      return msg;
  },
  success: function(msg) {
    // This will now output the same thing 
    //  across any current version of .NET.
    //console.log(msg.foo);
  }
});
};
于 2012-05-28T06:22:24.793 に答える