MVC 2 - Обновление данных модели, когда модель имеет тип IEnumerable / IQueryable - PullRequest
1 голос
/ 15 декабря 2010

Код контроллера:

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%>

Ответы [ 2 ]

0 голосов
/ 16 декабря 2010

В итоге я пошел по пути присвоения каждому элементу управления уникального имени, согласно сообщению Фила Хаака, начиная с индекса «[0.]» в качестве префикса. Затем я изменил свой метод действия, чтобы принять List(of DBContent), который правильно связал данные модели. Затем я смог вручную выполнить цикл по коллекции и вручную обновить каждую запись.

0 голосов
/ 15 декабря 2010

Вы просто никогда не звоните в UpdateModel, чтобы обновить коллекцию.

<HttpPost()> _
Function ManagePages(ByVal values As FormCollection) As ActionResult
    Dim pages = contentRepository.GetAllContentPagesByType("Content Page", False)

    UpdateModel(pages)

    contentRepository.Save() 'Simply calls SubmitChanges()
    Return View("ManagePages", pages)
End Function

Вы должны следовать инструкциям здесь: http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx

Ваши атрибуты имен <input> элементов должны следовать определенному синтаксису, чтобы это работало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...