как контроллер может обнаруживать изменения дочерних объектов / строк в представлении?

#asp.net #asp.net-mvc-3

#asp.net #asp.net-mvc-3

Вопрос:

Какой наиболее подходящий подход к следующему сценарию?

У меня есть две модели:

  1. Расписание: состоящее из четырех свойств: DayStartTime , DayEndTime , BreakTime , List<TimeSheetHours>
  2. Расписания: состоящие из четырех свойств: ClientId , ProjectId , HoursWorked

Мое представление табеля учета рабочего времени строго типизировано в IEnumerable<TimeSheet> списке. Этот список содержит 7 моделей расписания, по одной на каждый день недели с воскресенья по субботу. В этом представлении табеля учета рабочего времени используется редактор tempate для создания полей ввода для DayStartTime , DayEndTime , BreakTime , для каждого из дней недели:

Каждый день содержит раздел для клиентов и проектов. Нажатие кнопки «Добавить» запускает ajax-функцию, которая вызывает действие контроллера для рендеринга частичного представления, динамически вставляя строку элементов управления (выпадающее меню клиента, выпадающее меню проекта, текстовое поле HoursWorked) в соответствующий раздел клиенты и проекты на этот день:

Мне трудно понять, как я могу обновлять каждую модель расписания List<TimeSheetHours> , когда я добавляю новую строку клиента / проекта с помощью вызова ajax.

Итак, в конце концов, когда я отправляю контроллеру запрос на вставку расписания, у меня есть все, что мне нужно для каждой модели расписания в списке, который я создал для представления.

Любая помощь была бы высоко оценена.

Спасибо!

Комментарии:

1. проверьте мой ответ, должно сработать.

Ответ №1:

Вам придется либо изменить имена этих элементов перед их публикацией, чтобы они выглядели так, как у меня показано ниже, либо в вашем вызове ajax передать индекс TimeSheet , а затем создать имя:

TimeSheetHours Индекс = 0

 <input type="text" id="TimeSheet[0]_TimeSheetHours[0]_DayStartTime" 
    name="TimeSheet[0].TimeSheetHours[0].DayStartTime" value="1" />
<input type="text" id="TimeSheet[0]_TimeSheetHours[0]_DayEndTime" 
    name="TimeSheet[0].TimeSheetHours[0].DayEndTime" value="2" />
<input type="text" id="TimeSheet[0]_TimeSheetHours[0]_BreakTime" 
    name="TimeSheet[0].TimeSheetHours[0].BreakTime" value="1" />
  

TimeSheetHours Индекс = 1

 <input type="text" id="TimeSheet[0]_TimeSheetHours[1]_DayStartTime" 
    name="TimeSheet[0].TimeSheetHours[1].DayStartTime" value="3" />
<input type="text" id="TimeSheet[0]_TimeSheetHours[1]_DayEndTime" 
    name="TimeSheet[0].TimeSheetHours[1].DayEndTime" value="4" />
<input type="text" id="TimeSheet[0]_TimeSheetHours[1]_BreakTime" 
    name="TimeSheet[0].TimeSheetHours[1].BreakTime" value="0" />
  

Вероятно, гораздо лучше перехватить submit событие и выполнить итерацию по каждому TimeSheetHours элементу, представленному в html, присвоить имя в качестве маски, а затем отправить форму. Это должно позволить связующему модели восстановить ваше List<TimeSheet> заполненное List<TimeSheetHours> свойство.


Вот хорошее руководство о том, как решить эту проблему с публикацией коллекции: ASP.NET Привязка модели MVC 2 для коллекции

Комментарии:

1. Привет, охотник. Ценю ваш ответ. На самом деле проблема не в вышеуказанных трех полях. Это табель учета рабочего времени для наших полей: ClientID, ProjectID и HoursWorked. Эти поля добавляются через частичную страницу. И я выполнил некоторые переопределения имен полей, чтобы получить имена в аналогичном формате, как вы указали выше.

2. Этот же принцип присвоения имен может быть применен к этим select элементам

3. Хантер, когда я читаю ваш ответ немного дальше, я хотел добавить, что я фактически передаю идентификатор, который представляет номер модели 0-7, с помощью вызова ajax, который отображает частичное представление для полей расписания. Я передаю этот идентификатор в частичное представление, чтобы переопределить идентификаторы полей, таких как: @Html.DropDownListFor(модель => model. Идентификатор клиента, модель. Клиенты, новые { @id = ViewData. TemplateInfo.HtmlFieldPrefix = «[» ViewBag. Идентификатор поля «]»})

4. Ниже приведен пример имени, которое я создаю: [0.1].ClientID. 0 — это номер модели (индекс), затем я добавляю номер строки .1 поскольку у меня может быть много расписаний часов или строк с одинаковыми полями: clientid, projectid, hoursworked. Надеюсь, что это поможет. Ценю вашу помощь.

5. Хантер, спасибо за вашу помощь. Ваши ответы в конечном итоге привели меня в правильном направлении. У меня в основном были неправильные префиксы. Как только я правильно их выстроил, MVC сделал это волшебно и соответствующим образом обновил списки расписания. Приветствия