【问题标题】:pass json data to aspx webmethod page error: "System.Collections.Generic.IDictionary`2 is not supported for deserialization of an array"将 json 数据传递给 aspx webmethod 页面错误:“System.Collections.Generic.IDictionary`2 不支持数组的反序列化”
【发布时间】:2013-05-14 22:46:50
【问题描述】:

我想将 json 对象传递给 aspx 页面中的 WebMethod

这是我的 jquery 和 WebMethod

$("#button-login").bind({
        Click: accountRegister
    });



function accountRegister(e) {

    var dataObj = $("#login input[type]").serializeArray();
    var obj = JSON.stringify(dataObj);
    $.ajax({
        type: "POST",
        url: "Checkout.aspx/login",
        data: obj,
        contentType: "application/json; charset=UTF-8",
        dataType: "json",

        beforSend: function () {
            $(this).attr("disabled", "true");
            $(this).after(waitObj);
        },

        success: function (msg) {
            // Replace the div's content with the page method's return.
            alert("success");
            $("#checkout").slideUp("slow");
            $("#payment-address").slideDown("slow");
        },
        error: function (msg) {
         //alert(msg);
        },
        complete: function (jqxhr,status) {
            alert("Type:" + $.type(jqxhr) + "\n Respons text: " + jqxhr.responseText + "\n status: " + status);

            $(this).attr("disabled", "false");
            $(".wait").remove();

        },
    });
}

我的 checkout.cs 文件

  namespace Ahooratech
    {

        public partial class Checkout : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {

            }

            [WebMethod]
            public static string login(string obj)
            { return "{data:data}";}

    }

我得到了这个错误:

回复文本:{"Message":"Type \u0027****System.Collections.Generic.IDictionary`2****[[System.String, mscorlib,版本=4.0.0.0,文化=中性, PublicKeyToken=b77a5c561934e089],[System.Object, mscorlib, 版本=4.0.0.0,文化=中性, PublicKeyToken=b77a5c561934e089]]\u0027 不支持 数组的反序列化。",

“堆栈跟踪”:“在 System.Web.Script.Serialization.ObjectConverter.ConvertListToObject(IList 列表,类型类型,JavaScriptSerializer 序列化程序,布尔值 throwOnError, IList\u0026 转换列表)\r\n at System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeInternal(对象 o, Type type, JavaScriptSerializer 序列化器, Boolean throwOnError, 对象\u0026 转换的对象)\r\n 在 System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeMain(对象 o, Type type, JavaScriptSerializer 序列化器, Boolean throwOnError, 对象\u0026 转换的对象)\r\n 在 System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer 序列化程序、字符串输入、类型类型、Int32 depthLimit)\r\n at System.Web.Script.Serialization.JavaScriptSerializer.Deserialize[T](字符串 输入)\r\n 在 System.Web.Script.Services.RestHandler.GetRawParamsFromPostRequest(HttpContext 上下文,JavaScriptSerializer 序列化程序)\r\n at System.Web.Script.Services.RestHandler.GetRawParams(WebServiceMethodData 方法数据,HttpContext 上下文)\r\n 在 System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext 上下文,WebServiceMethodData methodData)","ExceptionType":"System.InvalidOperationException"}

编辑:错误代表一个类型castiny,但这个铸件在哪里? (我认为 JQuery 中存在隐式类型转换)

编辑:这是我发送到服务器的 json 格式的 obj 内容

"[{"name":"userName","value":"admin"},{"name":"password","value":"admin_"}]"

我认为这行 accountRegister() 是这样的:

var obj = JSON.Stringify({data:dataObj});

并在 WebMethod 中修改为:

public static string void login(Object data) {

}

它有效!

但我怎么能 id 反序列化 数据

【问题讨论】:

    标签: jquery asp.net ajax json webmethod


    【解决方案1】:

    我怀疑在将登录函数的参数更改为类型对象时不会出错。

    实际上,我会将所有参数分别传递给 webmethod,而不是作为一个对象。

    【讨论】:

    • 我认为有一个类型转换。 ajax方法执行post时引发的错误
    【解决方案2】:

    我用这个装饰我的 ajax 方法

     function accountRegister(e) {
    
    
        var data = $("#login input[type]").serializeArray();
    
        var str="[";
        $.each(data, function(index , value)
        {
            str += '{' + '"name"' + ":" + "\"" + value.name + "\"" + ', ' + '"value"' + ":" + "\"" + value.value + "\"" + '},';
    
    
        });
        // remove last char ","
        data = str.substr(0, str.length - 1);
       data += "]";
    
        $.ajax({
            type: "POST",
            url: "Checkout.aspx/login",
            data: JSON.stringify({ myData: data }),
            contentType: "application/json; charset=UTF-8",
            dataType: "json",
           // converts: {               "html text": function(data) { return $(data);}},
            //dataFilter: function(data,dataType) {           if(dataType == "json")        {    var dataFilter = $.parseJSON(data);        return data;              }              else return data;            },
            beforSend: function () {
                $(this).attr("disabled", "true");
                $(this).after(waitObj);
            },
    
            success: function (msg) {
                // Replace the div's content with the page method's return.
                alert("success");
              // $("#checkout").slideUp("slow");
               // $("#payment-address").slideDown("slow");
            },
    

    和这个的网络方法

    public  class nameVal
        {
            public string name { get; set; }
            public string value { get; set; }
        }
        [WebMethod]
        public static string login(object myData)
        {
    
            JavaScriptSerializer js = new JavaScriptSerializer();
            List<nameVal> myformElement = js.Deserialize<List<nameVal>>(myData.ToString());
    
            return "";
    
        }
    

    【讨论】:

      【解决方案3】:

      不幸的是,您不能将任何数组作为根对象传递给WebMethod。您必须使用 javascript 对象封装数据。此外,您的根对象键应与 WebMethod 的参数匹配。

      如果你想传递一个数组,你可以使用那种格式。

      JSON.stringfy({myArray: [1,2,3]})
      

      在这种情况下;你的WebMethod 签名应该是这样的

      [WebMethod]
      public static void MethodName(IEnumerable<object> myArray);
      

      枚举的内部类型可以是任何类型,但参数名称必须与json对象的参数名称匹配。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-08-01
        • 1970-01-01
        • 2020-02-11
        • 1970-01-01
        • 2014-06-30
        • 2012-05-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多