2

「関連商品」を追加できる商品編集ページがあります。製品を編集するためにページにアクセスすると、最初の関連アイテムがサーバー上でシリアル化され、隠しフィールドに保存されます。関連アイテムを追加すると、javascript/jQuery を使用してアイテムの配列を取得します$.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: 値を null にすることはできません。パラメータ名: type] System.Activator.CreateInstance(Type type, Boolean nonPublic) +9635174 System.Web.Script.Serialization.ObjectConverter.ConvertDictionaryToObject(IDictionary`2 dictionary, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertObject) +431 System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeInternal(Object o, Type 型, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertObject) +71 System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeMain(Object o, Type 型, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertObject) +147 System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 depth) +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& convertObject) +582589 System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeInternal(Object o, Type 型, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertObject) +71 System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeMain(Object o, Type 型, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertObject) +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 list, Type type, JavaScriptSerializer serializer, Boolean throwOnError, IList& convertList) +674 System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeInternal(Object o, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertObject) +112 System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeMain(Object o, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertObject) +147 System.Web.Script.Serialization. JavaScriptSerializer.Deserialize(JavaScriptSerializer シリアライザー、文字列入力、Type 型、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() in C:\Documents and Settings\path\UI \Admin\Products\Detail.cs:356 Shop.UI.Admin.Products.Detail.SaveClick(Object sender, EventArgs e) in 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 (ブール値 includeStagesBeforeAsyncPoint、ブール値 includeStagesAfterAsyncPoint) +5563

作成した新しいコンストラクターがパラメーターなしであるため、わかりません..何が間違っていますか?

4

2 に答える 2

0

本当に簡単な解決策を見つけました。を介してサーバーからアイテムを取得して javascript に戻すときは、 delete 演算子$.ajax()を使用してオブジェクトからプロパティ を削除します。.__type

それは完全に機能し、オブジェクトを逆シリアル化できるようになりました! そのような単純な解決策; これをもっと早く考えていたらよかったのに。

于 2012-07-25T18:33:37.170 に答える
0

この線か…

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

作成したコンストラクターと同じプログラムの部分、または派生クラスで? そうでない場合は、コンストラクターが見つからない理由が説明されます。

DotNetPerlsから: [protected internal] は、内部アクセシビリティ (このプログラムのすべての部分がメンバーを使用できる) と保護されたアクセシビリティ (すべての派生クラスがメンバーを使用できる) の両方を意味します。

于 2012-06-22T01:31:43.460 に答える