Коллекция сложных дочерних объектов в Asp. Net MVC 3?

Я хочу иметь возможность обновлять модель и все его коллекции дочерних объектов в одном представлении. Меня отсылали к этим примерам: http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx и http: // blog .stevensanderson.com / 2010/01/28 / edit-a-variable-length-list-aspnet-mvc-2-style / .

Например, у меня есть объект-консультант, у которого есть коллекция "Опыт работы". Все это есть в модели Entity Framework. В представлении простые свойства объекта Консультант не проблема, но я не могу получить текстовое поле для отображения коллекции. Я пробовал следовать примерам по ссылкам выше, но это не сработало. Проблема в том, что в этих примерах модель представляет собой просто список (а не объект со свойством дочернего списка). А также модель снова является моделью EF. И по какой-то причине это не работает, как в этих примерах.

Чтобы упростить задачу, я попытался сделать что-то вроде примера Фила Хаакса и просто заставил View показать текстовое поле:

@for (int i = 0; i < Model.WorkExperiences.Count; i++)
{
    Html.TextBoxFor(m => m.WorkExperiences[i].Name);
}

] Я попытался создать новый объект WorkExperience в контроллере для ViewModel:

    public ActionResult Create(int id)
    {
        Consultant consultant = _repository.GetConsultant(id);
        DetailsViewModel vm = new DetailsViewModel();
        vm.WorkExperiences = consultant.WorkExperiences.ToList();
        vm.WorkExperiences.Add(new WorkExperience());           
        return View(vm);
    }

Но View не показывает пустое текстовое поле для свойства WorkExperience Name. Если, с другой стороны, я создаю отдельный View только для добавления нового объекта WorkExperience, передавая новый пустой объект WorkExperience в качестве модели, это работает нормально:

@Html.EditorFor(model => model.Name)

Это дает мне пустое текстовое поле, и я могу сохранить новый объект. Но почему можно? t Я делаю это в том же представлении, что и объект «Консультант», с коллекциями в соответствии с примерами в приведенных выше ссылках?

Кстати, это своего рода ответ на предыдущий вопрос, который указал мне на приведенные выше ссылки , но я так и не нашел окончательного решения для этого. См. Этот вопрос, если требуется дополнительная информация: Создать представления для свойств объекта в модели в приложении MVC 3?

ОБНОВЛЕНИЕ:

Согласно ответам и комментариям ниже, вот обновление с View и EditorTemplate:

Вид:

@model Consultants.ViewModels.DetailsViewModel

@{
    ViewBag.Title = "Index";
}

Index

@Html.ActionLink("Add work experience", "CreateWorkExperience", new { id = ViewBag.Consultant.Id })

@foreach (var item in Model.WorkExperiences) { }
Name
@Html.ActionLink("Edit", "Edit", new { id = item.Id }) | @Html.ActionLink("Details", "Details", new { id = item.Id }) | @Html.ActionLink("Delete", "Delete", new { id = item.Id }) @item.Name
@for (int i = 0; i < Model. WorkExperiences.Count; i++) { Html.EditorFor(m => m. WorkExperiences[i]); }

(Обратите внимание, что все это на самом деле не совсем то, как я его спроектирую в конечном итоге, все, что мне нужно прямо сейчас, это заставить объект WorkExperience отображаться как пустое текстовое поле для заполнения, и иметь возможность добавлять и удалять такие текстовые поля, как в примерах Фила Хаака и Стивена Сандерсона.)

The EditorTemplate:

@model Consultants.Models.WorkExperience


@Html.TextBoxFor(m => m.Name);

Этот материал с EditorTemplate отлично работает в образце проекта Фила Хаака, который я скачал, чтобы попробовать, но здесь, с моделью EF или какой-либо другой проблемой, у меня вообще нет текстового поля. Таблица в представлении используется только в качестве теста, потому что в таблице я получаю строки для WorkExperiences, добавляю ли я пустой объект WorkExperience или заполняю его свойства, не имеет значения, строки отображаются для каждого объекта. Но опять же, нет текстового поля ...

6
задан Community 23 May 2017 в 10:29
поделиться