jQuery AJAX POST 对象 ASP.Net WebMethod 具有动态数据类型
jQuery AJAX POST object to ASP.Net WebMethod having dynamic datattypes
嗨,
任何人都知道我在这里做错了什么。我试着
POST JSON 使用 jQuery AJAX 反对 ASP.Net WebMethod。
虽然我在服务器端获取对象但不是我的方式
通缉。我希望客户对象是一个简单的对象,这样我就可以像普通实例一样访问,例如customer.Name,但我不能,因为它作为字典对象到达那里。
编辑:: 为什么 JSON 作为 C# 动态类型的字典对象进入服务器端?
这是快速观看的截屏视频;
这是 javascript 和服务器端代码。
function SaveCustomer() {
var funcParams = JSON.stringify({
customer: {
Name: "Name of Customer",
Title: "President"
},
address: {
Street: "Street",
City: "",
Zip: ""
}
});
// 我尝试使用以下 json 参数,但结果仍然相同。
var funcParams = "{\"customer\":" + JSON.stringify({ Name: "Name of
Customer", Title: "President" }) + ",\"address\":" +
JSON.stringify({ Street: "Street", City: "", Zip: "" }) + "}";
}
$.ajax({ type: "POST", contentType: "application/json; charset=utf-8",
dataType: "json", url: "aspxPage.aspx/SaveCustomer", data: funcParams,
success: function(){ }, error: function(e){alert("Error occured"+e);}
})
[WebMethod(EnableSession = true)]
public static string SaveCustomer(dynamic customer, dynamic address)
{
if(!string.IsNullOrEmpty(customer.Name) &&
!string.IsNullOrEmpty(customer.Title)....)
{
//app logic
}
}
我的建议是创建 DTO 对象以匹配 JSON,然后将您的方法参数更改为 Customer 和 Address 类型,而不是动态类型。像这样,例如:http://encosia.com/using-complex-types-to-make-calling-services-less-complex/
您可以使用 Visual Studio's "Paste JSON as Classes" 来创建那些 类 也非常 quick/easy。
如果您出于某种原因绝对不能使用专用 DTO 类,请尝试使用 ExpandoObject
作为参数类型而不是 dynamic
。自从我使用它以来已经有很长一段时间了,我不记得它们是否在 WebMethods 中正确反序列化,但我认为它们做到了。只需了解与常规 DTO POCO 相比,动态方法会导致性能下降。
我最近刚处理过这种情况。这是我的解决方案,如果你像我一样不想创建 DTO class.
1) 将序列化的 JSON 字符串传递给 WebMethod
$.ajax({ type: "POST", contentType: "application/json; charset=utf-8",
dataType: "json", url: "aspxPage.aspx/SaveCustomer", data: "{data: '" + funcParams + "'}",
success: function(){ }, error: function(e){alert("Error occured"+e);}
})
2) 使用 JSON.NET 反序列化字符串,一切顺利。
[WebMethod(EnableSession = true)]
public static string SaveCustomer(string data)
{
dynamic customer = JsonConvert.DeserializeObject(data);
customer.Name;
customer.Address;
.....
}
嗨,
任何人都知道我在这里做错了什么。我试着
POST JSON 使用 jQuery AJAX 反对 ASP.Net WebMethod。
虽然我在服务器端获取对象但不是我的方式
通缉。我希望客户对象是一个简单的对象,这样我就可以像普通实例一样访问,例如customer.Name,但我不能,因为它作为字典对象到达那里。
编辑:: 为什么 JSON 作为 C# 动态类型的字典对象进入服务器端?
这是快速观看的截屏视频;
这是 javascript 和服务器端代码。
function SaveCustomer() {
var funcParams = JSON.stringify({
customer: {
Name: "Name of Customer",
Title: "President"
},
address: {
Street: "Street",
City: "",
Zip: ""
}
});
// 我尝试使用以下 json 参数,但结果仍然相同。
var funcParams = "{\"customer\":" + JSON.stringify({ Name: "Name of
Customer", Title: "President" }) + ",\"address\":" +
JSON.stringify({ Street: "Street", City: "", Zip: "" }) + "}";
}
$.ajax({ type: "POST", contentType: "application/json; charset=utf-8",
dataType: "json", url: "aspxPage.aspx/SaveCustomer", data: funcParams,
success: function(){ }, error: function(e){alert("Error occured"+e);}
})
[WebMethod(EnableSession = true)]
public static string SaveCustomer(dynamic customer, dynamic address)
{
if(!string.IsNullOrEmpty(customer.Name) &&
!string.IsNullOrEmpty(customer.Title)....)
{
//app logic
}
}
我的建议是创建 DTO 对象以匹配 JSON,然后将您的方法参数更改为 Customer 和 Address 类型,而不是动态类型。像这样,例如:http://encosia.com/using-complex-types-to-make-calling-services-less-complex/
您可以使用 Visual Studio's "Paste JSON as Classes" 来创建那些 类 也非常 quick/easy。
如果您出于某种原因绝对不能使用专用 DTO 类,请尝试使用 ExpandoObject
作为参数类型而不是 dynamic
。自从我使用它以来已经有很长一段时间了,我不记得它们是否在 WebMethods 中正确反序列化,但我认为它们做到了。只需了解与常规 DTO POCO 相比,动态方法会导致性能下降。
我最近刚处理过这种情况。这是我的解决方案,如果你像我一样不想创建 DTO class.
1) 将序列化的 JSON 字符串传递给 WebMethod
$.ajax({ type: "POST", contentType: "application/json; charset=utf-8",
dataType: "json", url: "aspxPage.aspx/SaveCustomer", data: "{data: '" + funcParams + "'}",
success: function(){ }, error: function(e){alert("Error occured"+e);}
})
2) 使用 JSON.NET 反序列化字符串,一切顺利。
[WebMethod(EnableSession = true)]
public static string SaveCustomer(string data)
{
dynamic customer = JsonConvert.DeserializeObject(data);
customer.Name;
customer.Address;
.....
}