[英]How can I send complex JavaScript object to ASP.net WebMethod?
我正在尝试将客户端自定义对象(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) { ... }
其次,如果将javascript
转换为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();
由于它的类型是array
,因此永远不会在Addresses
添加值,但是您可以像设置为object
一样将其设置为值,因此,如果您想坚持使用array
,则需要将其更改为
currentCustomer.Addresses = new Array();
currentCustomer.Addresses.push($("#adHome").val());
currentCustomer.Addresses.push($("#adOffice").val());
如果您要将Addresses
用作数组,请使用此方法,但是如果您需要Addresses
成为包含HOME
和OFFICE
的object
,我将编辑答案
也许您可以使用像这样的javascript对象
currentCustomer.Addresses = {};
currentCustomer.Addresses["Home"] = $("#adHome").val();
currentCustomer.Addresses["Office"] = $("#adOffice").val();
使相当于Dictionary<string,string>
等效Dictionary<string,string>
但是如果它不起作用,您也可以像这样将Addresses
更改为class
public List<Address> Addresses { get; set; }
并添加类Address
public class Address
{
public string Home {get;set;}
public string Office {get;set;}
}
我本人从未使用过Dictionary
,所以我不知道它是否相同
您可以像这样更改源代码。
AJAX-
data: JSON.stringify({'customer':currentCustomer});
ASP.net Web方法-
[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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.