【问题标题】:spa upshot how to access grandparent entity?spa结果如何访问祖父母实体?
【发布时间】:2012-06-03 01:19:17
【问题描述】:

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

我做错了什么?

干杯

【问题讨论】:

  • 你的控制器看起来怎么样?您是否在 TodoItem 查询中包含“所有者”?这也可能导致循环引用...... paret-chidl-parent 引用并没有像现在看起来那样真正涵盖。这将导致序列化的无限循环。出于这个原因,我创建了一个 DTO,孩子仅通过他的字符串名称、id 引用父对象,而不是对父对象的完整引用。
  • 嘿 - 抱歉回复晚了。我不得不离开机器一会儿 :) 循环引用错误正是我得到的,经过大量研究,似乎用 json.net 替换序列化程序的替代修复会导致其他问题。所以看起来我现在必须坚持使用 mvc3 并稍后更新。使用字符串键是个好主意 - 我今晚会试试。

标签: knockout.js upshot


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    尝试使用 $parent 变量:

        <span data-bind="text: $parent.Name"></span> <br />
        <span data-bind="text: TodoItem().$parent.Name"></span> <br />
    

    【讨论】:

      猜你喜欢
      • 2012-04-26
      • 2021-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多