如何将复杂的JavaScript对象发送到WebMethod ASP.net

How can I send complex JavaScript object to ASP.net WebMethod?

本文关键字:WebMethod ASP net 对象 复杂 JavaScript      更新时间:2023-09-26

我正在尝试将我的客户端自定义对象(JavaScript(发送到 ASP.net Web方法。我使用 jQuery Ajax 命令来执行此操作。

有一个我的对象示例:

function Customer() {
    this.Name = "";
    this.Surname = "";
    this.Addresses = new Array();
}

我用这种方法加载数据:

function buildCurrentCustomer() {
    var currentCustomer = new Customer();
    /** General Info **/
    currentCustomer.Name = $("#Name").val();
    currentCustomer.Surname = $("#Surname").val();
    currentCustomer.Addresses = new Array();
    currentCustomer.Addresses["HOME"] = $("#adHome").val();
    currentCustomer.Addresses["OFFICE"] = $("#adOffice").val();
    return currentCustomer;
}

最后,我使用以下代码发送数据:

$.ajax({
        type: "POST",
        url: "../_layouts/CustomerManager/MasterPage.aspx/SetCustomer",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        data: "{customer: " + JSON.stringify(currentCustomer) + "}",
        cache: false,
        success: function (result) {
        },
        error: function (ex) {
            WriteToConsole(ex.responseText);
        }
    });

我的服务器端方法是这样的:

[WebMethod]
public static bool SetCustomer(CustomerModel Customer)
{
    //My code...
}

我的客户模型类是这样的:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Common.Model.JavaScriptModel
{
    public class CustomerModel
    {
        /** General Info **/
        public string Name {get;set;}
        public string Surname {get;set;}
        public Dictionary<string, string> Addresses { get; set; }
    }
}

问题是当我执行 Ajax 调用时,服务器端方法不会执行。如果我在以下位置更改服务器端方法的签名:

public static bool SetCustomer(List<CustomerModel> Customer)

执行 SetCustomer 方法,但列表为空。

为什么会有这个问题?在哪里可以找到有关此功能的文档?

谢谢

首先,如果你使用这样的数据

data: "{customer: " + JSON.stringify(currentCustomer) + "}",

在代码后面,你需要customer取相同的参数而不是Customer,所以这个

public static bool SetCustomer(CustomerModel Customer) { ... }

需要更改为

public static bool SetCustomer(CustomerModel customer) { ... }

其次,如果转换为asp.net,您在javascript中的Customer对象是这样的

string Name;
string Surname;
List<string> Addresses;

但是您在Addresses后面的代码中的class正在使用

Dictionary<string, string>

从而导致客户端的data无法在服务器端解析并向客户端返回错误,因此您需要将Addresses类更改为

public List<string> Addresses { get; set; }

最后,您在buildCurrentCustomer中的代码是这样设置的 Addresses

currentCustomer.Addresses = new Array();
currentCustomer.Addresses["HOME"] = $("#adHome").val();
currentCustomer.Addresses["OFFICE"] = $("#adOffice").val();

这永远不会给Addresses添加一个值,因为它的类型是一个array,但是你把值设置为它,就好像它是一个object,所以如果你想坚持使用一个array,你需要把它改成

currentCustomer.Addresses = new Array();
currentCustomer.Addresses.push($("#adHome").val());
currentCustomer.Addresses.push($("#adOffice").val());

*注意:

如果您想将Addresses用作数组,请使用此选项,但是如果您需要Addresses是包含HOMEOFFICEobject,我将编辑答案

编辑:

也许你可以使用这样的JavaScript对象

currentCustomer.Addresses = {};
currentCustomer.Addresses["Home"] = $("#adHome").val();
currentCustomer.Addresses["Office"] = $("#adOffice").val();

Dictionary<string,string>制作等效物,但如果它不起作用,您也可以像这样将Addresses更改为类

public List<Address> Addresses { get; set; }

并添加类Address

public class Address
{
    public string Home {get;set;}
    public string Office {get;set;}
}

我自己从来没有用过Dictionary,所以我不知道它是否相同

你可以像这样更改源代码。

阿贾克斯-

data:  JSON.stringify({'customer':currentCustomer});

ASP.net 网络方法-

 [WebMethod]
    public static bool SetCustomer(object customer)
    {
        CustomerModel CM = new CustomerModel();
        _Serializer = new JavaScriptSerializer();
        _StringBuilder = new StringBuilder();
        _Serializer.Serialize(customer, _StringBuilder);
        CM = _Serializer.Deserialize<CustomerModel>(_StringBuilder.ToString());
    }

请注意,您必须将页面顶部的_Serializer和_StringBuilder属性初始化为全局变量...

    public static JavaScriptSerializer _Serializer;
    public static StringBuilder _StringBuilder;