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

私が見つけた解決策はこれです。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 に答える
0

不正な JSON が問題の原因である可能性があります。

JSON の解析は非常に厳密です。文字列は常に二重引用符で囲む必要があります。生成された JSON をhttp://jsonlint.com/に渡してエラーを見つけることをお勧めします。

于 2013-03-19T10:38:56.963 に答える