我有一个产品编辑页面,允许您添加“相关项目”。当访问该页面以编辑产品时,它会在服务器上序列化其初始相关项并存储在隐藏字段中。当您添加相关项目时,我使用$.ajax()
. $.ajax()
正在调用一个返回对象列表的服务器端方法,如下所示:
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:值不能为空。参数名称:type] System.Activator.CreateInstance(Type type, Boolean nonPublic) +9635174 System.Web.Script.Serialization.ObjectConverter.ConvertDictionaryToObject(IDictionary`2字典,Type type,JavaScriptSerializer序列化器,Boolean throwOnError, Object&convertedObject) +431 System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeInternal(Object o, Type type, JavaScriptSerializer 序列化器, Boolean throwOnError, Object& convertObject) +71 System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeMain(Object o, Type type, JavaScriptSerializer 序列化器,布尔 throwOnError,对象和转换对象)+147 System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 深度)+199 System.Web.Script。
我确定该错误是由该__type
成员引起的。我怎样才能得到这个字符串反序列化?$.ajax()
或者我怎样才能用而不是得到该死的成员来检索我的物品__type
?
我尝试过但不起作用的东西:在我阅读的 SO 帖子中(我现在找不到它),它说要为您正在序列化的对象的构造函数提供访问级别,protected internal
并且它不会添加__type
成员。该类实际上没有构造函数或方法,因此我使用该访问级别制作了一个,并且确实该__type
成员不存在。但是现在我遇到了一个新错误:
[MissingMethodException:没有为“Shop.JSON.Product”类型定义无参数构造函数。] System.Web.Script.Serialization.ObjectConverter.ConvertDictionaryToObject(IDictionary`2 字典,类型类型,JavaScriptSerializer 序列化程序,布尔 throwOnError,Object&convertedObject)+582589 System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeInternal(Object o, Type type, JavaScriptSerializer 序列化器, Boolean throwOnError, Object& convertObject) +71 System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeMain(Object o, Type type, JavaScriptSerializer 序列化器, Boolean throwOnError, Object&convertedObject) +147 System.Web.Script.Serialization.ObjectConverter.AddItemToList(IList oldList, IList newList, Type elementType, JavaScriptSerializer 序列化器,Boolean throwOnError) +87 System.Web.Script.Serialization.ObjectConverter.ConvertListToObject(IList list, Type type, JavaScriptSerializer serializer, Boolean throwOnError, IList& convertList) +674 System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeInternal(Object o, Type类型,JavaScriptSerializer 序列化程序,布尔 throwOnError,对象和转换对象)+112 System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeMain(对象 o,类型类型,JavaScriptSerializer 序列化程序,布尔 throwOnError,对象和转换对象)+147 System.Web.Script.Serialization。 JavaScriptSerializer.Deserialize(JavaScriptSerializer 序列化器,字符串输入,类型类型,Int32 depthLimit)+66 System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(字符串输入)+74 Shop.UI.Admin.Products.Detail。CreateObject(Product& item) in C:\Documents and Settings\path\UI\Admin\Products\Detail.cs:720 Shop.UI.Admin.Products.Detail.Save() 在 C:\Documents and Settings\path\UI \Admin\Products\Detail.cs:356 Shop.UI.Admin.Products.Detail.SaveClick(Object sender, EventArgs e) 在 C:\Documents and Settings\path\UI\Admin\Products\Detail.cs: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
我不明白,因为我创建的新构造函数是无参数的。我做错了什么?