我正在尝试将客户端自定义对象(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...
}


我的CustomerModel类是这样的:

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方法已执行,但List为空。

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

谢谢

最佳答案

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

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


在后面的代码中,您需要使用相同的参数customer而不是Customer,因此

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


需要更改为

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


其次,如果将Customer中的javascript对象转换为asp.net

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


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

Dictionary<string, string>


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

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


最后,像这样设置buildCurrentCustomerAddresses内部的代码

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成为包含objectHOMEOFFICE,我将编辑答案

编辑:

也许您可以使用像这样的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,所以我不知道它是否相同

关于javascript - 如何将复杂的JavaScript对象发送到ASP.net WebMethod?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25762268/

10-10 19:02