1

我正在尝试让 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 -->

我究竟做错了什么?

干杯

4

2 回答 2

1

正如 Obiwan007 所建议的,您可以通过将反向引用设置为 NULL 来解决序列化问题。如果您使用 Code First,还可以应用 [IgnoreDataMember] 属性。

结果只使父实体可观察,而不是它们的子实体。因此,当使用内置映射功能时,与子实体的数据绑定将不起作用。

解决方案是在 Javascript 中手动创建客户端实体并自己映射它们。我发布了一个可行的解决方案来回答一个不同的问题:https ://stackoverflow.com/a/10010695/1226140

于 2012-04-05T07:29:04.180 回答
0

尝试使用 $parent 变量:

    <span data-bind="text: $parent.Name"></span> <br />
    <span data-bind="text: TodoItem().$parent.Name"></span> <br />
于 2012-06-02T17:19:17.367 回答