我有一个产品编辑页面,允许您添加"相关项目"。访问页面以编辑产品时,它会在服务器上序列化其初始相关项并存储在隐藏字段中。当您添加相关项时,我使用$.ajax()
在javascript / jQuery中检索项目数组。 $.ajax()
正在调用一个服务器端方法,该方法返回一个对象List,如下所示:
Fyodor.JSON.SearchResult r = new Fyodor.JSON.SearchResult();
DataSet ds = retrieveData();
foreach (DataRow row in ds.Tables[0].Rows)
{
JSON.Product i = new JSON.Product();
//set all Product data in `i`
if (!string.IsNullOrEmpty(i.PartNumber))
{
r.Results.Add(i);
}
}
//set r.TotalPageCount
return r;
当我将这个项目数组返回到我的javascript中时,每个项目都提供了一个等于__type
的成员JSON.Product
。最初序列化项目时,此__type
成员不存在。我使用JSON.stringify(my_arrar_of_items)
序列化新集合并存储回隐藏字段
当我保存产品并检索隐藏字段的值并尝试使用
JavaScriptSerializer s = new JavaScriptSerializer();
relatedItems = s.Deserialize<List<JSON.Product>>(hiddenField.Value);
我收到错误:
[ArgumentNullException:Value不能为null。 参数名称:类型] System.Activator.CreateInstance(Type type,Boolean nonPublic)+9635174 System.Web.Script.Serialization.ObjectConverter.ConvertDictionaryToObject(IDictionary`2 dictionary,Type type,JavaScriptSerializer serializer,Boolean throwOnError,Object&amp; convertedObject)+431 System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeInternal(Object o,Type type,JavaScriptSerializer serializer,Boolean throwOnError,Object&amp; convertedObject)+71 System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeMain(Object o,Type type,JavaScriptSerializer serializer,Boolean throwOnError,Object&amp; convertedObject)+147 System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 depth)+199 System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeList(Int32 depth)+141 System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 depth)+231 System.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize(String input,Int32 depthLimit,JavaScriptSerializer serializer)+80 System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer serializer,String input,Type type,Int32 depthLimit)+44 System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(String input)+74 C:\ Documents and Settings \ path \ UI \ Admin \ Products \ Detail.cs中的Shop.UI.Admin.Products.Detail.CreateObject(Product&amp; item):720 C:\ Documents and Settings \ path \ UI \ Admin \ Products \ Detail.cs中的Shop.UI.Admin.Products.Detail.Save():356 在C:\ Documents and Settings \ path \ UI \ Admin \ Products \ Detail.cs中的Shop.UI.Admin.Products.Detail.SaveClick(Object sender,EventArgs e):121 System.Web.UI.WebControls.Button.OnClick(EventArgs e)+118 System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument)+112 System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument)+10 System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl,String eventArgument)+13 System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData)+36 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint,Boolean includeStagesAfterAsyncPoint)+5563
我确定错误是由于此__type
成员造成的。如何将此字符串反序列化?或者我如何使用$.ajax()
检索我的商品而不是获取该__type
成员?
我试过但没有用的东西:在我读过的SO帖子中(我现在无法找到它),它说给你正在序列化protected internal
访问级别的对象的构造函数它不会添加__type
成员。该类实际上没有构造函数或方法,因此我使用该访问级别创建了一个,并且确实__type
成员不存在。但现在我收到了一个新错误:
[MissingMethodException:没有为&#39; Shop.JSON.Product&#39;。的类型定义无参数构造函数。 System.Web.Script.Serialization.ObjectConverter.ConvertDictionaryToObject(IDictionary`2 dictionary,Type type,JavaScriptSerializer serializer,Boolean throwOnError,Object&amp; convertedObject)+582589 System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeInternal(Object o,Type type,JavaScriptSerializer serializer,Boolean throwOnError,Object&amp; convertedObject)+71 System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeMain(Object o,Type type,JavaScriptSerializer serializer,Boolean throwOnError,Object&amp; convertedObject)+147 System.Web.Script.Serialization.ObjectConverter.AddItemToList(IList oldList,IList newList,Type elementType,JavaScriptSerializer serializer,Boolean throwOnError)+87 System.Web.Script.Serialization.ObjectConverter.ConvertListToObject(IList列表,Type类型,JavaScriptSerializer序列化程序,Boolean throwOnError,IList&amp; convertedList)+674 System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeInternal(Object o,Type type,JavaScriptSerializer serializer,Boolean throwOnError,Object&amp; convertedObject)+112 System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeMain(Object o,Type type,JavaScriptSerializer serializer,Boolean throwOnError,Object&amp; convertedObject)+147 System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer serializer,String input,Type type,Int32 depthLimit)+66 System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(String input)+74 C:\ Documents and Settings \ path \ UI \ Admin \ Products \ Detail.cs中的Shop.UI.Admin.Products.Detail.CreateObject(Product&amp; item):720 C:\ Documents and Settings \ path \ UI \ Admin \ Products \ Detail.cs中的Shop.UI.Admin.Products.Detail.Save():356 在C:\ Documents and Settings \ path \ UI \ Admin \ Products \ Detail.cs中的Shop.UI.Admin.Products.Detail.SaveClick(Object sender,EventArgs e):121 System.Web.UI.WebControls.Button.OnClick(EventArgs e)+118 System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument)+112 System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument)+10 System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl,String eventArgument)+13 System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData)+36 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint,Boolean includeStagesAfterAsyncPoint)+5563
我不明白,因为我创建的新构造函数无参数..我做错了什么?
答案 0 :(得分:0)
这条线......
JSON.Product i = new JSON.Product();
在与您创建的构造函数相同的程序部分中,还是在派生类中?如果没有,那么这就解释了为什么它找不到构造函数。
来自DotNetPerls:[protected internal]表示内部可访问性(此程序的所有部分都可以使用该成员)和受保护的可访问性(所有派生类都可以使用该成员)。
答案 1 :(得分:0)
我找到了一个非常简单的解决方案。当我通过$.ajax()
将服务器中的项目检索回javascript时,我使用delete operator从对象中删除.__type
属性。
它完美无缺,我现在可以反序列化我的对象了!这么简单的解决方案;我希望我早点想到这一点。