C# 如何在网站中反序列化ajax调用的result.d中包含的字符串?
这是一个简化流程,但更容易解释: 我有一个应用程序,它使用JQuery调用一个webmethod,它获取返回值并存储在一个隐藏字段中,这样在回发后代码就可以访问它 我有以下代码:C# 如何在网站中反序列化ajax调用的result.d中包含的字符串?,c#,javascript,ajax,C#,Javascript,Ajax,这是一个简化流程,但更容易解释: 我有一个应用程序,它使用JQuery调用一个webmethod,它获取返回值并存储在一个隐藏字段中,这样在回发后代码就可以访问它 我有以下代码: $.ajax({ type: 'POST', contentType: 'application/json; charset=utf-8', data: JSON.stringify({ contacts: _contacts }), dataType:
$.ajax({
type: 'POST',
contentType: 'application/json; charset=utf-8',
data: JSON.stringify({ contacts: _contacts }),
dataType: 'json',
url: '/MyPage.aspx/MyMethod',
success: function (result) {
hdn.val(result.d);
}
});
在我的代码隐藏中,我尝试获取这些信息并对其进行解析:
protected void btnRegister_Click(object sender, EventArgs e)
{
ContactInfo[] importedContacts = new JavaScriptSerializer().Deserialize<ContactInfo[]>(this.hdContacts.Value);
}
protectedvoid btnRegister\u单击(对象发送者,事件参数e)
{
ContactInfo[]importedContacts=新的JavaScriptSerializer()。反序列化(this.hdContacts.Value);
}
但我有一个例外,那就是:
值不能为null。参数名称:类型
我发现问题在于这个_类型的参数,它不存在于我的ContactInfo对象中。
我想知道如何反序列化这些信息。这应该很容易反序列化,因为它直接来自我的ajax调用
编辑:关于“type”参数:它由.NET Framework自动添加,以便序列化WebMethod MyPage.aspx/MyMethod的返回对象。我设想,如果框架在序列化数据时添加此信息,我可以使用相同的序列化程序对其进行反序列化
在hdnValue中,我有以下字符串:
[{uuuu type:“Un.Socialize.ContactInfo”,“ID:“123”,“FirstName:“First”,“LastName:“Last”,“FullName:“First-Last”,“EMail:”email@email.com,“昵称”:“尼克”,“图片”:“Pic.jpg”,“AlreadyExists”:false}]
如果我(在调试期间)删除了“\uuuu type:…”参数,它就会工作
在阅读中,我注意到问题不在于WebMetro的响应,而在于我的反序列化。我不应该那样做。
因为那里有一些旧代码,所以我必须找到一个解决方法,可能将值存储在hdnField中,并在服务器端构建对象。最好的方法是进行单元测试 请提供字符串“data:JSON.stringify({contacts:_contacts})”
以及ContactInfo对象的结构。如果可能,在Chrome开发者工具或Firebug中嗅探请求,并给出完整的HTTP post请求。然后我们可以立即找到解决方案。发生的事情是,您的ContactInfo有一个_类型字段,不能为空,并且您提供的数据(通过jQuery/JSON/AJAX/…)没有_类型字段 因此,您必须调整ContactInfo或JSON数据
function AddTypeToContacts(contacts) {
var mangledcontacts=new Array();
for (var i=0;i<contacts.Length;i++) {
var c=contacts[i];
if (!c._Type) c._Type='whatever';
mangledcontacts[mangledcontacts.Length]=c;
}
return mangledcontacts;
}
$.ajax({
type: 'POST',
contentType: 'application/json; charset=utf-8',
data: JSON.stringify({ contacts: AddTypeToContacts(contacts) }),
dataType: 'json',
url: '/MyPage.aspx/MyMethod',
success: function (result) {
hdn.val(result.d);
}
});
函数AddTypeToContacts(联系人){
var mangledcontacts=新数组();
对于(var i=0;ii)如果您正在将结果序列化为json,那么如果您将其放入param字符串中,它应该自动强制转换到列表中:public ActionResult Something(list importedContacts){}刚刚编辑了这个问题…反序列化在我的btnClick按钮中…是的,对不起…我跳到了结论w/mvc…我会在明天我工作的时候,在我访问代码的时候做,好吗?事实上是另一种方式:提供的数据有一个属性_类型,当我ebMethod(MyPage.aspx/MyMethod)返回(它包含我的类的名称,例如MyApp.ContactInfo)。我的ContactInfo类没有名为type的属性。我想象,如果.NET Framework自动添加此属性,它将使用需要它的序列化程序,因此我可以使用相同的序列化程序反序列化它