Заполните коллекцию моделей дочерних представлений при публикации в контроллер - PullRequest
1 голос
/ 29 августа 2011

У меня есть страница, где вы можете добавить компанию.Компания имеет несколько сотрудников.Вот мои модели представлений:

public class CompanyViewModel
{
    [ScaffoldColumn(false)]
    public int CompanyId { get; set; }

    public string Name{ get; set; }

    public List<EmployeeViewModel> Employees { get; set; }
}

public class EmployeeViewModel
{
    [ScaffoldColumn(false)]
    public int EmployeeId { get; set; }

    public int CompanyId { get; set; }

    public string FirstName { get; set; }

    public string LastName { get; set; }
}

На моей странице есть функция jQuery для динамического добавления / удаления сотрудников.Когда я публикую свою форму, мой вид выглядит следующим образом:

<input id="CompanyId" name="CompanyId" type="hidden" value="0" />

<input id="Name" name="Name" type="text" value="Test company name" />

<input id="Employees[1].FirstName" name="Employees[1].FirstName" type="text" value="fn1" />
<input id="Employees[1].LastName" name="Employees[1].LastName" type="text" value="ln1" />

<input id="Employees[2].FirstName" name="Employees[2].FirstName" type="text" value="fn2" />
<input id="Employees[2].LastName" name="Employees[2].LastName" type="text" value="ln2" />

<input id="Employees[3].FirstName" name="Employees[3].FirstName" type="text" value="fn3" />
<input id="Employees[3].LastName" name="Employees[3].LastName" type="text" value="ln3" />

И мой метод контроллера:

[HttpPost]
public ActionResult Create(CompanyViewModel viewModel)
{
    ...
}

Когда я прохожу через отладчик, чтобы увидеть, что в моей модели представления послеопубликовать форму, коллекция сотрудников является нулевым.Через CompanyId и Name передаются, но не в коллекции Employees.

Я также пытался изменить идентификатор и имя ввода с Employees[1].FirstName на Model.Employees[1].FirstName, но это тоже не помогло.

Что я здесь не так делаю?

Я использую MVC 3 и Razor.

Ответы [ 3 ]

2 голосов
/ 29 августа 2011

Я бы предложил сделать

@Html.TextBoxFor(m => m.Employees[i].FirstName)

, а затем проверить сгенерированный HTML, чтобы убедиться, что у вас есть правильное соглашение об именах.Это может быть больше похоже на Employees__1_FirstName или что-то в этом роде.

2 голосов
/ 29 августа 2011

Я могу ошибаться, но вот как я справлюсь с этим.

создайте частичное представление, чтобы показать всех сотрудников.создайте частичное представление, чтобы показать отдельного сотрудника.

передать модель сотрудников в частичное представление сотрудников, которое, в свою очередь, перебирает и отображает частичное представление сотрудника для каждого сотрудника.

затем во время выполнения, когда пользователь добавляет сотрудника, я отправляю обратно в контроллер, используя jQuery ajax.

Контроллер добавляет сотрудника и возвращает обработанный частичный контроль сотрудника.

Успех вызова ajax затем (добавляет), что новый сотрудник частично просматривает html в списке сотрудников, уже находящихся там.

Мое представление принимает форму formview, которая содержит компанию и List<Employee>

edit

Однако вы можете использовать декоратор [bind] для вашего контроллера.

[Bind(Prefix="ContactDetails")] userDetail UserDetail

edit 2

убрать нумерацию с имен сотрудников.тогда в вашем контроллере вы можете использовать следующее

[HttpPost]
public ActionResult Create(CompanyViewModel viewModel, [Bind(Prefix="Employees")] List<EmployeeViewModel> Employees)
{
    ...
}

Вот как я использовал аналогичную вещь в другом проекте

0 голосов
/ 11 ноября 2015

Можете ли вы попробовать следующее утверждение вместо

@Html.HiddenFor(x => x.itemlist[i].Id)
@Html.DisplayFor(x => x.itemlist[i].Name)
@Html.DisplayFor(x => x.itemlist[i].Surname)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...