#asp.net #asp.net-mvc-3
#asp.net #asp.net-mvc-3
Вопрос:
Какой наиболее подходящий подход к следующему сценарию?
У меня есть две модели:
- Расписание: состоящее из четырех свойств:
DayStartTime
,DayEndTime
,BreakTime
,List<TimeSheetHours>
- Расписания: состоящие из четырех свойств:
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 сделал это волшебно и соответствующим образом обновил списки расписания. Приветствия