2012-03-23 42 views
1

我試圖得到一個SPA以下基本工作模式:spa結束如何訪問祖父母實體?

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; } 
} 

在我看來,我嘗試這樣做:

<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> 

我也嘗試添加一個計算的屬性ActionItem含業主名稱:

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 --> 

我在做什麼錯?

乾杯

+0

如何看您的控制器?你在TodoItem查詢中做了一個Include「Owner」嗎? 此外,這可能會導致循環引用... paret-chidl-parent引用並沒有真正覆蓋,因爲它看起來現在。這將導致序列化中的無限循環。 因爲這個原因,我創建了一個DTO,我們只能通過他的字符串名稱,id來引用父對象,而不是對父對象的完整引用。 – Obiwan007 2012-03-24 07:23:26

+0

嘿 - 對於遲到的回覆感到抱歉。我不得不離開機器一會兒:)循環引用錯誤正是我得到的,在經過大量研究後,似乎用json.net替換serialiser的替代修復會導致其他問題。所以看起來我現在必須堅持使用mvc3並稍後更新。使用字符串鍵是一個好主意 - 今晚我會嘗試。 – nugget 2012-03-27 06:07:29

回答

1

至於建議的Obiwan007,你的情況下通過設置反向引用NULL解決序列化問題。如果您使用Code First,您也可以應用[IgnoreDataMember]屬性。

Upshot僅使父實體可觀察,而不是其子實體。因此,當使用內置的映射功能時,與子實體的數據綁定將不起作用。

解決方案是在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 />