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] 属性を適用することもできます。

Upshot は親エンティティのみを監視可能にし、子エンティティは監視可能にしません。そのため、組み込みのマッピング機能を使用する場合、子エンティティへのデータ バインディングは機能しません。

解決策は、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 に答える