результат спа, как получить доступ к прародительскому объекту?

Я пытаюсь заставить 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 -->

Что я делаю неправильно?

Ваше здоровье


person nugget    schedule 23.03.2012    source источник
comment
Как выглядит ваш контроллер? Выполняете ли вы Include Owner в своем запросе TodoItem? Также это может привести к циклическим ссылкам... Ссылки paret-chidl-parent на самом деле не охватываются, как кажется сейчас. Это привело бы к бесконечному циклу сериализации. По этой причине я создал DTO, поскольку ребенок ссылается на родителя только через его строковое имя, идентификатор, а не полную ссылку на родительский объект.   -  person Obiwan007    schedule 24.03.2012
comment
эй - извините за поздний ответ. Мне пришлось ненадолго отойти от машины :) Ошибка циклических ссылок - это именно то, что я получил, и после долгих исследований кажется, что альтернативное исправление замены сериализатора с помощью json.net вызывает другие проблемы. Так что, похоже, мне придется пока придерживаться mvc3 и обновить позже. Использование строкового ключа - хорошая идея - я попробую это сегодня вечером.   -  person nugget    schedule 27.03.2012


Ответы (2)


Как предложил Obiwan007, вы решаете проблемы с сериализацией, устанавливая обратную ссылку на NULL. Вы также можете применить атрибут [IgnoreDataMember], если используете Code First.

Upshot делает наблюдаемыми только родительские объекты, а не их дочерние объекты. Таким образом, при использовании встроенной функции сопоставления привязка данных к дочерним объектам не будет работать.

Решение состоит в том, чтобы вручную создавать объекты на стороне клиента в Javascript и сопоставлять их самостоятельно. Я опубликовал рабочее решение в ответ на другой вопрос: https://stackoverflow.com/a/10010695/1226140

person Bart Jolling    schedule 05.04.2012

Попробуйте использовать переменную $parent:

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