Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/456.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在网站中反序列化ajax调用的result.d中包含的字符串?_C#_Javascript_Ajax - Fatal编程技术网

C# 如何在网站中反序列化ajax调用的result.d中包含的字符串?

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:

这是一个简化流程,但更容易解释: 我有一个应用程序,它使用JQuery调用一个webmethod,它获取返回值并存储在一个隐藏字段中,这样在回发后代码就可以访问它

我有以下代码:

$.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自动添加此属性,它将使用需要它的序列化程序,因此我可以使用相同的序列化程序反序列化它