トラビス、ここであなたが受け入れた答えがあることは知っていますが、これについて少し横方向の考え方を伝えたいと思いました. 最近、非常によく似た問題に直面し、何も機能せず、すべての [scriptignore] 属性などを試しました。
最終的にうまくいったのは、Automapper を使用して、プロキシ オブジェクトからスリム化された poco オブジェクトへのマップを作成することでした。これにより、2分以内にすべての問題が解決しました。これはすべて、プロキシにボールをプレーさせようとするときに36時間の包囲精神が優勢になった後のことです-shish :-)
暫定的に考えるべき別のアプローチ。
[編集] - Automapper の使用 (これは automapper を参照する小さなテスト アプリです)
参照: http://automapper.codeplex.com/
nuget: インストール パッケージ AutoMapper
クラス:
public sealed class One : BaseViewModel
{
// init collection in ctor as not using EF in test
// no requirement in real app
public One()
{
Two = new Collection<Two>();
}
public int OneId { get; set; }
public ICollection<Two> Two { get; set; }
}
public class Two
{
public int TwoId { get; set; }
public int OneId { get; set; }
[ScriptIgnore]
public virtual One One { get; set; }
}
public abstract class BaseViewModel
{
public string AsJson()
{
var serializer = new JavaScriptSerializer();
return serializer.Serialize(this);
}
}
public class OnePoco : BaseViewModel
{
public int OneId { get; set; }
public virtual ICollection<TwoPoco> Two { get; set; }
}
public class TwoPoco
{
public int TwoId { get; set; }
public int OneId { get; set; }
}
テスト コントローラー コード:
public ActionResult Index()
{
// pretend this is your base proxy object
One oneProxy = new One { OneId = 1 };
// add a few collection items
oneProxy.Two.Add(new Two() { OneId = 1, TwoId = 1, One = oneProxy});
oneProxy.Two.Add(new Two() { OneId = 1, TwoId = 2, One = oneProxy});
// create a mapping (this should go in either global.asax
// or in an app_start class)
AutoMapper.Mapper.CreateMap<One, OnePoco>();
AutoMapper.Mapper.CreateMap<Two, TwoPoco>();
// do the mapping- bingo, check out the asjson now
// i.e. oneMapped.AsJson
var oneMapped = AutoMapper.Mapper.Map<One, OnePoco>(oneProxy);
return View(oneMapped);
}
これを試してみて、どうやってうまくいくか見てください。確かに私にとってはうまくいきました。「地球」が動きました:)