ASP.NET MVC - привязка дочерней сущности к модели

Это кажется мне до боли очевидным, но по какой-то причине я не могу заставить его работать так, как я хочу. Возможно, это невозможно, как я делаю, но это кажется маловероятным. Этот вопрос может быть несколько связанным: Модель ASP.NET MVC Привязка связанных объектов на той же странице.

У меня есть EditorTemplate для редактирования объекта с несколькими ссылками на связанные объекты. Когда редактор визуализируется, пользователю предоставляется раскрывающийся список для выбора связанных сущностей, при этом раскрывающийся список возвращает идентификатор в качестве своего значения.

<%=Html.DropDownListFor(m => m.Entity.ID, ...)%>

При отправке запроса значение формы получает ожидаемое имя: «Entity.ID», однако моя строго типизированная модель, определенная как параметр действия, не имеет Entity.ID, заполненного значением, переданным в запросе.

public ActionResult AddEntity(EntityWithChildEntities entityWithChildEntities) { }

Я попытался поиграть с атрибутом Bind () и указал Bind(Include = "Entity.ID") на entityWithChildEntities, но, похоже, это не сработало. Я также пробовал Bind(Include = "Entity"), но это привело к тому, что ModelBinder попытался привязать полное определение «сущности» (что неудивительно).

Есть ли способ получить привязку модели по умолчанию для заполнения идентификатора дочерней сущности, или мне нужно будет добавить параметры действия для каждого идентификатора дочерней сущности, а затем вручную скопировать значения в определение модели?


person Nathan Taylor    schedule 01.06.2010    source источник
comment
Имеет ли свойство Entity какой-либо модификатор доступа, кроме public? нравится; public HomeTestModelChild Child { get; internal set; }   -  person cem    schedule 02.06.2010
comment
Нет, сэр, это все публично.   -  person Nathan Taylor    schedule 02.06.2010


Ответы (2)


Вы смотрели AutoMapper? Я согласен, что этого не должно быть, потому что привязка должна работать, но ...

У меня были небольшие трудности с использованием помощника Html.XYZFor, и я вернулся к использованию нотации MVC 1.1, и все это работает.

person griegs    schedule 01.06.2010
comment
На самом деле я еще не проверял AutoMapper. Это было какое-то время в планах. - person Nathan Taylor; 02.06.2010

Не существует DropDownListFor вспомогательного метода, который принимает один параметр. Стандартный метод DropDownListFor принимает как минимум два параметра: первый - это лямбда, используемая для вычисления имени выбора, а второй - IEnumerable<SelectListItem>:

<%= Html.DropDownListFor(m => m.Entity.ID, Model.EntitiesList) %>

Также как выглядит тип EntityWithChildEntities? Это должно быть примерно так:

public class EntityType
{
    public string ID { get; set; }
}

public class EntityWithChildEntities
{
    public EntityType Entity { get; set; }

    public IEnumerable<SelectListItem> EntitiesList
    {
        get 
        {
            return new[]
            {
                new SelectListItem { Value = "1", Text = "foo" },
                new SelectListItem { Value = "2", Text = "bar" },
            }
        }
    }
}
person Darin Dimitrov    schedule 02.06.2010
comment
Я ценю ответ, но мой псевдокод не предназначался для буквального толкования. С точки зрения реализации все построено правильно; проблема в том, что, несмотря на получение правильно названных значений в сообщении формы, дочерние сущности модели не заполняются. Другими словами, имена и значения полей формы правильные, но результат модели не такой, как ожидалось. - person Nathan Taylor; 02.06.2010