2

我有一个产品编辑页面,允许您添加“相关项目”。当访问该页面以编辑产品时,它会在服务器上序列化其初始相关项并存储在隐藏字段中。当您添加相关项目时,我使用$.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

我不明白,因为我创建的新构造函数无参数的。我做错了什么?

4

2 回答 2

0

这条线是...

JSON.Product i = new JSON.Product();

在程序的与您创建的构造函数相同的部分中,还是在派生类中?如果不是,那么这就解释了为什么它找不到构造函数。

来自DotNetPerls:[受保护的内部] 意味着内部可访问性(该程序的所有部分都可以使用该成员)和受保护的可访问性(所有派生类都可以使用该成员)。

于 2012-06-22T01:31:43.460 回答
0

我找到了一个非常简单的解决方案。当我通过 将服务器中的项目检索回 javascript 时$.ajax(),我使用delete 运算符从对象中删除.__type属性。

它工作得很好,我现在可以反序列化我的对象!如此简单的解决方案;希望我早点想到这一点。

于 2012-07-25T18:33:37.170 回答