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

时间:2013-05-20 11:27:03

标签: jquery asp.net ajax json webmethod

我希望在aspx页面中将json对象传递给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}";}

    }

我得到这个Errro:

  

响应文字:{“消息”:“类型   \ 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 不支持   数组的反序列化 。“,

     

“StackTrace”:“at   System.Web.Script.Serialization.ObjectConverter.ConvertListToObject(IList的   list,Type type,JavaScriptSerializer serializer,Boolean   throwOnError,IList \ u0026 convertedList)\ r \ n at   System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeInternal(对象   o,Type type,JavaScriptSerializer serializer,Boolean throwOnError,   Object \ u0026 convertedObject)\ r \ n at   System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeMain(对象   o,Type type,JavaScriptSerializer serializer,Boolean throwOnError,   Object \ u0026 convertedObject)\ r \ n at   System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer   serializer,String input,Type type,Int32 depthLimit)\ r \ n at   System.Web.Script.Serialization.JavaScriptSerializer.Deserialize [T](字符串   输入)\ r \ n at   System.Web.Script.Services.RestHandler.GetRawParamsFromPostRequest(HttpContext的   context,JavaScriptSerializer序列化程序)\ r \ n at   System.Web.Script.Services.RestHandler.GetRawParams(WebServiceMethodData   methodData,HttpContext context)\ r \ n at   System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext的   context,WebServiceMethodData   methodData)”, “ExceptionType”: “System.InvalidOperationException”}

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

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

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

我认为这行accountRegister()对此:

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

并在WebMethod中修改为:

public static string void login(Object data ) {

}

它有效!

但是我如何识别Deserilize 数据

enter image description here

3 个答案:

答案 0 :(得分:0)

我怀疑在将登录功能的参数更改为类型对象时,您不会收到错误。

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

答案 1 :(得分:0)

我装饰我的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 "";

    }

答案 2 :(得分:0)

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

如果要传递数组,则可以使用该格式。

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

在这种情况下;您的WebMethod签名应该像

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

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