「関連商品」を追加できる商品編集ページがあります。製品を編集するためにページにアクセスすると、最初の関連アイテムがサーバー上でシリアル化され、隠しフィールドに保存されます。関連アイテムを追加すると、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
作成した新しいコンストラクターがパラメーターなしであるため、わかりません..何が間違っていますか?