控制器代码:
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对象,并为一些属性创建文本框和其他输入 - 基本上我正在为模型中的每个记录显示一个编辑器。这很好。
现在我尝试了许多不同的方法来更新它:
我现在能想到让它工作的唯一方法是循环遍历FormCollection参数中的所有项目,并手动更新集合中的每个DBContent记录,但这似乎不是最佳实践溶液
问题是 - 此方案更新任何可枚举类型的模型的黄金标准最佳做法是什么?
修改
如果有帮助,这里是视图的代码段。请注意,使用Html.TextBox等似乎不会影响生成的表单数据。我总是得到4个表单键,使用逗号分隔值(基本上每个属性一个)。我已经尝试使用记录ID(唯一键)预先添加它们,但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%>
答案 0 :(得分:0)
您根本不会调用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>
元素名称属性需要遵循特定的语法才能生效。
答案 1 :(得分:0)
根据Phil Haack的帖子,我开始给每个控件赋予一个唯一的名称,从索引“[0.]”开始作为前缀。然后我将Action方法更改为接受List(of DBContent)
,它正确绑定了模型数据。然后我能够手动循环遍历集合,并手动更新每条记录。