如何使用 Ajax 和 ASP.NET WebMethod 传递 JSON 对象

Posted

技术标签:

【中文标题】如何使用 Ajax 和 ASP.NET WebMethod 传递 JSON 对象【英文标题】:How to pass JSON object using Ajax with ASP.NET WebMethod 【发布时间】:2012-11-07 02:23:27 【问题描述】:

我在使用 Ajax 和 ASP.NET WebMethods 传递 JSON 对象时遇到问题

function setStudentInfo() 
    var jsonObjects = [
         id: 1, name: "mike" ,
         id: 2, name: "kile" ,
         id: 3, name: "brian" ,
         id: 1, name: "tom" 
    ];

    $.ajax(
        type: "POST",
        url: "ConfigureManager.aspx/SetStudentInfo",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        async: false,
        data:  students: JSON.stringify(jsonObjects) ,
        success: function (result) 
            alert('success');
        ,
        error: function (result) 
            alert(result.responseText);
        

    );

ASP.NET 代码

[WebMethod]
public static void SetStudentInfo(object students)

     //Here I want to iterate the 4 objects and to print their name and id

我收到以下错误:

""Message":"无效的 JSON 原语:学生。","StackTrace":" 在 System.Web.Script.Serialization.javascriptObjectDeserializer.DeserializePrimitiveObject() 在 System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 深度) 在 System.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize(字符串输入,Int32 depthLimit,JavaScriptSerializer 序列化程序) 在 System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer 序列化程序,字符串输入,类型类型,Int32 depthLimit) 在 System.Web.Script.Serialization.JavaScriptSerializer.Deserialize[T](字符串输入) 在 System.Web.Script.Services.RestHandler.GetRawParamsFromPostRequest(HttpContext 上下文,JavaScriptSerializer 序列化程序) 在 System.Web.Script.Services.RestHandler.GetRawParams(WebServiceMethodData 方法数据,HttpContext 上下文) 在 System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext context, WebServiceMethodData methodData)","ExceptionType":"System.ArgumentException""

【问题讨论】:

您遇到了什么问题(更具体地说)? 【参考方案1】:

我知道这是一个老问题,但如果有人来这里寻求答案,这就是解决方案;

var jsonObjects=[
     id: 1, name: "mike" ,
     id: 2, name: "kile" ,
     id: 3, name: "brian" ,
     id: 1, name: "tom" 
];

$.ajax(
    type: "POST",
    url: "ConfigureManager.aspx/SetStudentInfo",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    async: false,
    data: JSON.stringify( students: jsonObjects ),
    success: function (result) 
        alert('success');
    ,
    error: function (result) 
        alert(result.responseText);
    

);

【讨论】:

【参考方案2】:

将整个 JSON 作为字符串传递,如下所示:

data: 'variable: "value"'

如果我像你一样尝试通过它,我总是会得到一个错误。

【讨论】:

键也需要引用。【参考方案3】:

您收到该错误是因为需要一个对象,但您的代码需要一个对象列表。有时这可能有点棘手。为了使数据传输更容易,您应该创建一个具有要传递给 WebMethod 的对象类型的属性的类,因为 ASP.NET 似乎更容易解析它。例如:

public class Student

    private string _name;
    private int _id;
    public string name 
        get  return _name; 
        set  _name = value; 
    
    public int id 
        get  return _id; 
        set  _id = value; 
    

然后您的 WebMethod 将更改为接受学生类对象列表,如下所示:

[WebMethod]
public static void SetStudentInfo(List<Student> Students)

    foreach (Student s in Students)
    
        //Do whatever here System.Console.WriteLine(s.name);
    

那么您需要做的就是稍微改变您的 Ajax 调用,如下所示:

function setStudentInfo() 
    var jsonObjects = [
         id: 1, name: "mike" ,
         id: 2, name: "kile" ,
         id: 3, name: "brian" ,
         id: 1, name: "tom" 
    ];

    $.ajax(
        type: "POST",
        url: "ConfigureManager.aspx/SetStudentInfo",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        async: false,
        data:  Students: JSON.stringify(jsonObjects) ,
        success: function (result) 
            alert('success');
        ,
        error: function (result) 
            alert(result.responseText);
        

    );

【讨论】:

【参考方案4】:

试试这个代码:

function setStudentInfo() 

var jsonObjects = "students" : [
     id: 1, name: "mike" ,
     id: 2, name: "kile" ,
     id: 3, name: "brian" ,
     id: 1, name: "tom" 
];

$.ajax(
    type: "POST",
    url: "ConfigureManager.aspx/SetStudentInfo",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    async: false,
    data: JSON.stringify(jsonObjects),
    success: function (result) 
        alert('success');
    ,
    error: function (result) 
        alert(result.responseText);
    

);

【讨论】:

【参考方案5】:

您实际上并没有将 json 发送到服务器,发送 json 只需为 data 属性传递一个 json 字符串。

data: JSON.stringify(jsonObjects),

【讨论】:

执行更改时,我得到以下信息" ""Message":"Type \u0027System.Collections.Generic.IDictionary`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]\u0027 不支持数组的反序列化。","StackTrace":" at System.Web.Script.Serialization.ObjectConverter.ConvertListToObject(IList list, Type type, JavaScriptSerializer序列化器, Boolean throwOnError, IList&convertList @user829174 我对 asp.net 了解不多,但看起来您的 webmethod 需要一个对象并获取一个数组。 感谢您的反馈,我应该如何更改我的方法的签名,以便能够将特定的 JSON 对象发送到服务器,您能分享代码吗?

以上是关于如何使用 Ajax 和 ASP.NET WebMethod 传递 JSON 对象的主要内容,如果未能解决你的问题,请参考以下文章

如何在我的 .NET 3.5 Web 应用程序中安装和使用 ASP.NET AJAX 控件工具包?

ASP.Net MVC、AJAX 和渐进增强

如何使用ajax删除asp.net中的记录

如何使用asp.net核心在action方法中接收通过ajax请求发送的文件和整数

如何使用ajax在asp.net mvc中上传多个图像

如何使用 ASP.NET MVC Rest API 调用和 jQuery Ajax 下载文件