3

従来のAPIコントローラーとWebAPIコントローラーの両方を使用してMVC4アプリケーションを構築しています。コードファーストでEF5も使用しているので、循環参照につながるナビゲーションプロパティがあります。JsonIgnoreJsonにシリアル化するときに循環参照ループに遭遇しないように、これらのナビゲーションプロパティの属性を使用しています。

このアプローチは、私のWeb APIコントローラーでは問題なく機能しますがHtml.Raw(Json.Encode(Model))、従来のコントローラーのRazorテンプレートで使用すると、循環参照のために例外が発生します。

オブジェクトのシリアル化中に循環参照が検出されました

この例外はで発生しSystem.Web.Script.Serialization.JavaScriptSerializer.SerializeValueInternalます。Json.Encode別のJsonエンコーダー(json.netではない)を使用しているように見えるので、これを正しく解釈していますか?Razorテンプレート内からWebAPIで使用される構成済みのJson.Netフォーマッターを使用するにはどうすればよいですか?

次のクラスを使用する回避策を思いつきました

namespace MyMVCProject.Globals
{
    public class Helper
    {
        public static string ToJson(object obj)
        {
            return JsonConvert.SerializeObject(obj, GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings);
        }
    }
}

テンプレート内で使用できます。@Html.Raw(MyMVCProject.Globals.Helper.ToJson(Model))

これは、私がデフォルトの動作であると期待するものに対してはまだ厄介だと感じていますJson.Encode

4

1 に答える 1

0

そうです、呼び出すJson.Encodeときは、 class のメソッドを使用していますSystem.Web.Helpers.Json

別の Json エンコーダーを使用する場合は、それを使用してください。JsonConvertへの呼び出しをラップし、それを構成するヘルパー クラス (必要なフォーマッターを含む) を使用して、これまでと同じように行うことができます。

名前空間の記述を避けることができるように、ラッパー クラスの名前空間を含めることができます。(頻繁に使用する場合は、ビューの web.config で実行できます)。

は静的クラス メンバーであり、その名前空間は常に razor ビューに含まれているため、動作を変更することはできませんJson.Encode(同じ名前空間からさらに多くのものが必要になるため)。

シリアル化するオブジェクトへの拡張メソッドとして実装することもできます。構文のみが変更されます。

このページでわかるように[DataContract]、属性を使用してシリアライゼーションをカスタマイズすることもできます。

クラス定義で対象のプロパティにアタッチされた他の Json.Net 属性を使用して、各メンバーをシリアル化する方法をカスタマイズすることもできます。

于 2013-04-04T14:27:04.860 に答える