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」です)。