我正在努力让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 :(得分:1)
根据Obiwan007的建议,您可以通过将后引用设置为NULL来解决序列化问题。如果使用Code First,也可以应用[IgnoreDataMember]属性。
Upshot仅使父实体可观察,而不是其子实体。因此,在使用内置映射功能时,与子实体的数据绑定将不起作用。
解决方案是在Javascript中手动创建客户端实体并自行映射。我发布了一个工作解决方案,以回答另一个问题:https://stackoverflow.com/a/10010695/1226140
答案 1 :(得分:0)
尝试使用$ parent变量:
<span data-bind="text: $parent.Name"></span> <br />
<span data-bind="text: TodoItem().$parent.Name"></span> <br />