spa upshot如何访问祖父母实体?

时间:2012-03-23 14:59:07

标签: knockout.js upshot

我正在努力让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 -->

我做错了什么?

干杯

2 个答案:

答案 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 />