如何将复杂的JavaScript对象发送到WebMethod ASP.net
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...
}
我的客户模型类是这样的:
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
是包含HOME
和OFFICE
的object
,我将编辑答案
编辑:
也许你可以使用这样的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;
- 当包含另一个asp文件时,是否也包含所有引用的样式和脚本页面
- 借助asp.net验证或java脚本对多个文本进行验证
- 将Javascript数组发送到控制器ASP.NET MVC
- ASP.NET通过单击JavaScript按钮触发c#事件
- 文本框不是从Javascript/Asp.net中的对话框中打印出来的
- WebMethod在ASP.Net Web角色(Web窗体)中不起作用
- ASP.NET WebMethod将整个页面返回给JQuery ajax请求
- ASP.NET使用Jquery/AAJAX执行WebMethod
- 尝试从ajax静态WebMethod获取asp.net(C#)文本框文本时出错
- Asp.net WebMethod-返回字符串[]并使用JavaScript进行解析
- ASP.NET 服务器未将页面重新发送到 C# WebMethod上的客户端
- 如何将复杂的JavaScript对象发送到WebMethod ASP.net
- 用来自asp WebMethod的数据填充jquery自动完成
- ASP.net 3.5 WebMethod奇异行为,jQuery AJAX接收奇异数据
- Asp.net中的Ajax调用([WeBMethod]函数未调用)
- Jquery AJAX与ASP.NET WebMethod刷新整个页面
- ASP.NET WebMethod以json形式返回对象,但不在响应方法中
- ASP.NET 从 JS AJAX 调用非静态 Webmethod
- PageMethods没有定义异常:不调用ASP.NET中的WebMethod
- 从WebMethod (AJAX ASP.net)返回对象