【问题标题】:{"Message":"Invalid web service call, missing value for parameter: \u0027PersonID\u0027."{"Message":"无效的 Web 服务调用,缺少参数值:\u0027PersonID\u0027。"
【发布时间】:2017-07-11 15:55:44
【问题描述】:

我正在尝试进行 ajax 调用以通过 asmx webservice 提取 jqgrid 中的数据,但我收到了这个 Invalid web service call,缺少参数错误的值。

如果我删除 Web 服务调用和 ajax 请求中的输入参数,该函数运行良好,但一旦我有了输入参数,问题仍然存在。

以下是web服务方法

    [WebMethod]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public PersonsGrid Per(string PersonID)
    {
        ....
        return personsGrid;
    }

以下是 Ajax 调用:

function getGridInfo() {

    var personId = document.getElementById('txtPersonID').value;           

    $("#PersonsInfo").jqGrid({

        url: '/Service/PersonsService.asmx/GetPersonsInfo',
        data: "{'PersonID': '" + personId + "'}",

        datatype: 'json',
        mtype: 'POST',
        async: false,
        ajaxGridOptions: { contentType: 'application/json; charset=utf-8' },
        serializeGridData: function (postData) {
            return JSON.stringify(postData);
        },
        jsonReader: { repeatitems: false, root: "d.rows", page: "d.page", total: "d.total", records: "d.records" },
        loadonce: false,
        colNames: ['ID', 'FirstName', 'LastName', 'Email', 'Phone'],
        colModel: [
                        { name: 'FirstName', index: 'FirstName', width: 100 },
                        { name: 'LastName', index: 'LastName', width: 100 },
                        { name: 'Email', index: 'Email', width: 100 },
                        { name: 'Phone', index: 'Phone', width: 100 }
        ],
        rowNum: 10,
        rowList: [10, 20, 30],
        viewrecords: true,
        gridview: true,
        rownumbers: true,
        caption: 'Persons info',
        loadError: function (xhr, textStatus, errorThrown) {
            var error_msg = xhr.responseText;
            var msg = "Some error occured during processing:";
            msg += '\n\n' + error_msg;
            alert(msg);
        }
    });   

关于如何克服这个问题的任何想法。我关注了其他几个帖子,但仍然没有用。它必须对 ajax 请求中的 data 参数做一些事情。

【问题讨论】:

  • 您的 mType 不应该是“GET”而不是“POST”吗?
  • 即使这样,我也会得到同样的错误,我还在web方法中添加了usehttpget = true。

标签: javascript c# jquery ajax jqgrid


【解决方案1】:

选项

 data: "{'PersonID': '" + personId + "'}"

包含两个错误:

  1. jqGrid 不“知道”data 参数,该参数存在于 jQuery.ajax 中。而不是那个可以使用postData参数。
  2. {'PersonID': 'same_value'} 这样的字符串是错误的 JSON 字符串,因为 JSON 需要使用 " 而不是 '。您可以通过使用来修复代码
  3. 如果您使用datapostData 作为JSON 字符串,那么您应该删除serializeGridData
postData: '{"PersonID": "' + personId + '"}'

但是这样的代码仍然会包含错误的代码。我建议您改用 JSON.stringify,它将对象转换为 JSON 字符串:

postData: JSON.stringify({PersonID: personId})

或者,您可以删除 datapostData 并使用以下 serializeGridData

serializeGridData: function () {
    return JSON.stringify({PersonID: personId});
}

这样的回调函数忽略了标准参数,它发送jqGrid,它会以JSON格式发送PersonID参数。

【讨论】:

  • 这行得通,我使用了替代选项 serializeGridData: function () { return JSON.stringify({PersonID: personId}); }
【解决方案2】:

你有没有尝试过改变

data: "{'PersonID': '" + personId + "'}",

postData: "{'PersonID': '" + personId + "'}",

您似乎在 serializeGridData 函数中引用 postData。

【讨论】:

  • 我也试过了,但它仍然给出相同的错误信息
【解决方案3】:

根据定义 postData 参数是一个对象,它不能是一个字符串。更多参数类型can be read here

因此,恕我直言,明确的解决方案是将 postData 设置为对象并像这样使用 serializeGridData:

...jqGrid({
    ...
    postData : { "PersonID" : personId },
    serializeGridData : function( postData ) {
        return JSON.stringify(postData);
    },
    ...
 });

亲切的问候

【讨论】:

  • jQuery.ajax 允许使用string 作为data 参数的值,而不仅仅是PlainObject 通常使用。函数$.extend() 可以在第一个参数处使用string 调用,并且字符串不会更改。因此postData: "some string" 可以用作与data: "some string" 一起调用$.ajax 的简写形式。如果您使用type: "POST",那么字符串“some string”将被放置在Ajax 请求的正文中。因此postData: "some string" 也有效。只需像服务器期望的那样构造postData 的字符串值。
  • 确实是这样,但是构造一个带参数的字符串是非常困难的,特别是如果需要添加更多的变量——你会需要添加大量的`+'和"`。清晰且代码可读的方法是首先构造对象,然后使用 JSON.stringify - 但最终这是一个选择问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-24
  • 2011-09-22
  • 1970-01-01
  • 1970-01-01
  • 2019-08-05
相关资源
最近更新 更多