Код контроллера:
Function ManagePages() As ActionResult
Dim pages = contentRepository.GetAllContentPagesByType("Content Page", False)
Return View("ManagePages", pages)
End Function
<HttpPost()> _
Function ManagePages(ByVal values As FormCollection) As ActionResult
Dim pages = contentRepository.GetAllContentPagesByType("Content Page", False)
''' **** HOW DO I UPDATE THE MODEL HERE ****
contentRepository.Save() 'Simply calls SubmitChanges()
Return View("ManagePages", pages)
End Function
GetAllContentPagesByType возвращает IQueryable - результат запроса LINQ-to-SQL.Представление строго типизировано:
Inherits="System.Web.Mvc.ViewPage(Of IQueryable (Of DBContent))"
Я перебираю каждый из объектов DBContent в представлении и создаю текстовые поля и другие входные данные для нескольких свойств - в основном я отображаю редактор для каждой записи в модели,Это прекрасно работает.
Теперь я пробовал много разных способов получить это обновление:
- Вызов UpdateModel (), затем SubmitChanges () в контексте данных LINQ - ничего не сделал.
- Следовал учебному пособию Фила Хаака «Привязка к списку», но он не углубляется в детали обновления модели: http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx
- Использовал варианты типов параметров в HttpPost для ManagePagesбезрезультатно.
Единственный способ заставить его работать сейчас - это перебрать все элементы в параметре FormCollection и вручную обновить каждую запись DBContent в коллекции,но это не похоже на наилучшее практическое решение.
Вопрос в том, каков золотой стандарт для этого сценария по обновлению модели любого перечислимого типа?
Редактировать
Если это поможет, вот фрагмент кода для представления.Обратите внимание, что использование Html.TextBox и т. Д., Похоже, не влияет на итоговые данные формы.Я всегда получаю 4 ключа формы со значениями, разделенными запятыми (в основном по одному для каждого свойства).Я попытался добавить их с помощью идентификатора записи (уникальный ключ), но UpdateModel () по-прежнему не работает, хотя я получаю уникальное значение формы для каждого элемента управления вводом:
<% Using Html.BeginForm%>
<% For Each item In Model.OrderBy(Function(c) c.DisplayOrder)%>
<%: Html.Hidden("ContentId", Model.ContentId.ToString())%>
<tr>
<td class="first"><input name='Enabled' type="checkbox" checked='<%: If(Model.Enabled, "checked", "")%>' /></td>
<td class="first"><input name='DisplayOrder' type="text" value='<%: Model.DisplayOrder %>' style="width:40px" /></td>
<td class="first"><select name='ContentLevel'>
<option value="100" selected='<%: If(Model.ContentLevel = 100, "selected", "") %>'>Admin</option>
<option value="50" selected='<%: If(Model.ContentLevel = 50, "selected", "") %>'>Board</option>
<option value="25" selected='<%: If(Model.ContentLevel = 25, "selected", "") %>'>Member</option>
<option value="0" selected='<%: If(Model.ContentLevel = 0, "selected", "") %>'>Everyone</option>
</select></td>
<td><a href="EditPage/<%: Model.ContentId %>"><%: Model.PageTitle%></a></td>
<td><%: Model.aspnet_User.UserName%></td>
<td class="last"><%: Model.ModifiedOn%></td>
</tr>
<% Next%>
<% End Using%>