0

我陷入了这个我无法解决的问题。我尝试了很多解决方案,我也在 StackOverflow 上搜索并发现了许多旨在解决这个问题的问题,但没有什么对我有用。这是我的问题:我有这个功能

$.ajaxWS = function (options) {
    options.url = app.siteUrl + options.url;
    var data = JSON.stringify(options.data);
    var defaults = {
        type: "GET",
        contentType: "application/json; charset=utf-8",
        url: location.protocol + '//' + location.host + location.pathname,
        dataType: "json",
        cache: false,
        crossDomain: true,
        data: JSON.stringify(options.data),
        converters: {
            "text json": function (jsonString) {
                var res = JSON.parseNet(jsonString);
                if (res && res.hasOwnProperty("d")) res = res.d; //.net 3.5
                return res;
            }
        },
        success: function (response, textStatus, XMLHttpRequest) {
            options.success(response, textStatus, XMLHttpRequest);
        },
        error: function (xhr, textStatus, errorThrown) {
            if(xhr.status != 0)
                options.error(xhr, textStatus, errorThrown);
        }
    };
    var options = $.extend(defaults, options);
    return $.ajax(options);

};

当我在字段数据中传递任何字符串时,就像这些

 $.ajaxWS({
    url: "urlFunction",
    data: { field1: $('#text1').val(), field2: $('#text2').val() },
    success: function(){
        alert('Success!');
    },
    error: function(xhr, textStatus, errorThrown){
        alert(errorThrown);
    }
});

它总是返回这个错误

{"Message":"JSON primitive not valid: field1.","StackTrace":"   in System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializePrimitiveObject()\r\n   in System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 depth)\r\n   in System.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize(String input, Int32 depthLimit, JavaScriptSerializer serializer)\r\n   in System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer serializer, String input, Type type, Int32 depthLimit)\r\n   in System.Web.Script.Services.RestHandler.GetRawParamsFromGetRequest(HttpContext context, JavaScriptSerializer serializer, WebServiceMethodData methodData)\r\n   in System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext context, WebServiceMethodData methodData)","ExceptionType":"System.ArgumentException"}

我找到了一个以这种方式引用参数的解决方案

data: { field1: "'" + $('#text1').val() + "'", field2: "'" + $('#text2').val() + "'" },

但这只是一种解决方法。我也经常使用 $.ajax 选项,例如

processData: false,
traditional: true,

或传递数据不与

data: JSON.stringify(options.data),

但只有

data: options.data,

或将其放在引号之间,但所有这些尝试都不起作用。我给你另一个信息:这个方法适用于整数和日期。只有字符串会产生问题。你知道如何解决这个问题吗?非常感谢你。

4

2 回答 2

0

格式错误的 JSON 可能是您的问题的原因。

JSON解析非常严格。字符串必须始终用双引号括起来。我建议通过http://jsonlint.com/传递您生成的 JSON以发现任何错误。

于 2013-03-19T10:38:56.963 回答
0

我找到的解决方案是这样的。在 POST 中传递所有数据

$.ajaxWS = function (options) {
    options.url = app.siteUrl + options.url + (app.SessionID?"?ASPSESSID=" + app.SessionID:"");
    options.data = JSON.stringify(options.data);

    var defaults = {
        type: "POST",
        contentType: "application/json; charset=utf-8",
        url: location.protocol + '//' + location.host + location.pathname,
        dataType: "json",
        cache: false,
        crossDomain: true,
        data: {},
        converters: {
            "text json": function (jsonString) {
                var res = JSON.parseNet(jsonString);
                if (res && res.hasOwnProperty("d")) res = res.d; //.net 3.5
                return res;
            }
        },
        success: function (response, textStatus, XMLHttpRequest) {
            options.success(response, textStatus, XMLHttpRequest);
        },
        error: function (xhr, textStatus, errorThrown) {
            if(xhr.status != 0)
                options.error(xhr, textStatus, errorThrown);
        }
    };
    var options = $.extend(defaults, options);
    return $.ajax(options);

};

并在我的 ASP.Net 项目的 web.config 中添加这一行

<add name="Access-Control-Allow-Methods" value="POST, GET, OPTIONS"/>

以这种方式,我可以在没有单引号的情况下安静地传递参数。

于 2013-03-26T09:22:05.100 回答