2012-03-23 6 views
1

は、私は次のような基本的なモデルで作業するSPA取得しようとしている:spa upshot祖父母団体にアクセスするには?

public class Owner 
{ 
    public int OwnerId { get; set; } 
    [Required] 
    public string Name { get; set; } 

    public virtual ICollection<TodoItem> TodoItems { get; set; } 
} 

public class TodoItem 
{ 
    public int TodoItemId { get; set; } 
    [Required] 
    public string Title { get; set; } 
    public bool IsDone { get; set; } 

    public int OwnerId { get; private set; } 
    public virtual Owner Owner { get; set; } 
    public virtual ICollection<ActionItem> ActionItems { get; set; } 
} 

public class ActionItem 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 

    public int TodoItemId { get; private set; } 
    public virtual TodoItem TodoItem { get; private set; } 
} 

をし、私の見解では私が試したこの:私も含むActionItemする計算されたプロパティを追加しようとした

<div data-bind="foreach: ActionItem"> 
<div data-bind="attr:{id:Id}"> 
    <span data-bind="text: Name"></span><br /> <!-- works --> 
    <span data-bind="text: TodoItem().Name"></span><br /> <!-- doesn't work --> 
    <span data-bind="text: TodoItem().Owner().Name"></span> <br /> <!-- doesn't work --> 
</div> 
</div> 

所有者名:

public string OwnerName 
{ 
get { return this.TodoItem.Owner.Name; } 
} 

と呼び出し:

<span data-bind="text: OwnerName"></span><br /> <!-- doesn't work --> 

が、私は別の静的な文字列を追加し、手動で値を設定した場合:

public string SomethingElse { get; set; } 

を、これは正常に動作します:私は間違って何をやっている

<span data-bind="text: SomethingElse"></span><br /> <!-- works --> 

乾杯Obiwan007によって示唆されるように

+0

あなたのコントローラがどのように見えますか? TodoItemクエリに「オーナー」を含めるのですか? これも循環参照につながる可能性があります... paret-chidl-parent参照は、現在のように実際にはカバーされていません。シリアライゼーションの無限ループにつながります。 私はその理由のためにDTOを作成しました。子は、親オブジェクトへの完全な参照ではなく、文字列名、idだけを介して親を参照しています。 – Obiwan007

+0

こんにちは - 遅く返事を申し訳ありません。私はちょっとマシンから離れなければなりませんでした:)循環参照エラーはまさに私が得たものであり、多くの研究の後に、json.netとシリアライザを交換する代わりの修正が他の問題を引き起こすようです。だから私は今のところmvc3に固執し、後で更新する必要があるように見えます。文字列キーを使うのは良い考えです - 私は今夜それを試みます。 – nugget

答えて

1

は、あなたはケースNULLへの後方参照を設定することにより、直列化の問題を解決します。コードファーストを使用している場合は、[IgnoreDataMember]属性を適用することもできます。

アップショットは、親エンティティだけを観察可能にし、子エンティティは観察しません。したがって、組み込みマッピング機能を使用する場合、子エンティティへのデータバインディングは機能しません。

解決策は、クライアントサイドのエンティティをJavascriptで手動で作成して、自分でマップすることです。私は別の質問に応じて、実用的なソリューションを投稿:https://stackoverflow.com/a/10010695/1226140

0

は$親変数を使用してみてください:

<span data-bind="text: $parent.Name"></span> <br /> 
    <span data-bind="text: TodoItem().$parent.Name"></span> <br /> 
関連する問題