首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将json数据传递给aspx webmethod页面错误:“数组的反序列化不支持System.Collections.Generic.IDictionary`2”

将json数据传递给aspx webmethod页面错误:“数组的反序列化不支持System.Collections.Generic.IDictionary`2”
EN

Stack Overflow用户
提问于 2013-05-20 19:27:03
回答 3查看 5.7K关注 0票数 0

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

下面是我的jquery和WebMethod

代码语言:javascript
复制
$("#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文件

代码语言:javascript
复制
  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”:“类型\u0027****System.Collections.Generic.IDictionary`2****[System.String,deserialization ,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089,System.Object,mscorlib,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089]\u0027 不支持数组 of an array。”,

“System.Web.Script.Serialization.ObjectConverter.ConvertListToObject(IList”:“at System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeInternal(Object list,类型类型,Boolean序列化程序,Boolean throwOnError,IList\u0026 convertedList)\r\n at System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeInternal(Object o,类型类型,Boolean序列化程序,Boolean throwOnError,对象\u0026 convertedObject)\r\n at System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeMain(Object o,类型类型,JavaScriptSerializer序列化程序,Boolean throwOnError,对象)\r\n在System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer序列化程序,字符串输入,类型类型,convertedObject depthLimit)\r\n在System.Web.Script.Serialization.JavaScriptSerializer.DeserializeT\r\n在System.Web.Script.Services.RestHandler.GetRawParamsFromPostRequest(HttpContext上下文,JavaScriptSerializer序列化程序)\r\n在System.Web.Script.Services.RestHandler.GetRawParams(WebServiceMethodData methodData,System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext context)\r\n at HttpContext context,WebServiceMethodData methodData)","ExceptionType":"System.InvalidOperationException"}

编辑:错误表示类型强制转换,但是这个转换在哪里?(我认为JQuery中存在隐式类型转换)

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

代码语言:javascript
复制
"[{"name":"userName","value":"admin"},{"name":"password","value":"admin_"}]"

我把这几行accountRegister()计算成这样:

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

并在WebMethod中修改为:

公共静态字符串void login(Object data) {

}

而且它起作用了!

但是我怎么才能反序列化数据呢?

EN

回答 3

Stack Overflow用户

发布于 2019-04-24 01:50:25

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

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

代码语言:javascript
复制
JSON.stringfy({myArray: [1,2,3]})

在本例中,您的WebMethod签名应如下所示

代码语言:javascript
复制
[WebMethod]
public static void MethodName(IEnumerable<object> myArray);

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

票数 3
EN

Stack Overflow用户

发布于 2013-05-21 01:29:14

我怀疑您在将登录函数的参数更改为object类型时不会出现错误。

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

票数 0
EN

Stack Overflow用户

发布于 2013-05-21 16:15:22

我将我的ajax方法修饰成这样

代码语言:javascript
复制
 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");
        },

和web方法来实现。

代码语言:javascript
复制
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 "";

    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16648471

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档