我想不通,为什么这是不行的。 我读过(在这里和整个网络)一切说,这是如何绑定到编辑列表,但我并没有任何成功。 我有两个问题:
由视图发出的HTML表单元素不被编入索引(每一个被命名为“数量”和“BoxID”而不是“[0] .Qty”和“[0] .BoxID”)。 我已经在这个元旦晚会New Year读到的一切说HTML.EditorFor和HiddenFor助手会自动选择这个了。
甚至当我手动更改视图吐出正确的HTML(用正确的名称表单元素)模型绑定未正确发生,并在控制器的操作方法收集参数为null。
有任何想法吗? 难道我做错了什么?
这里的观点:
@ModelType IEnumerable(of HonorBox)
@Code
ViewData("Title") = "Index"
End Code
<h2>Index</h2>
@Html.BeginForm("Index", "HonorBoxes")
@Html.AntiForgeryToken()
@For x = 0 To Model.Count - 1
@<tr>
<td>
@Html.DisplayFor(Function(i) Model(x).BoxID)
@Html.HiddenFor(Function(i) Model(x).BoxID)
</td>
<td>
@Html.TextBoxFor(Function(i) Model(x).Qty)
@Html.ValidationMessageFor(Function(i) Model(x).Qty)
</td>
</tr>
Next
而这些控制器方法:
Function Index() As ActionResult
Dim hb = From h In db.honorBoxes Select h Where Not h.Filled And Not h.Hold
Return View(hb.ToList())
End Function
<HttpPost>
Function Index(boxes As IEnumerable(Of HonorBox)) As ActionResult
If ModelState.IsValid Then
For Each box In boxes
Dim cbox = db.honorBoxes.Find(box.BoxID)
If Not IsDBNull(box.Qty) AndAlso cbox.Qty <> box.Qty Then
cbox.Qty = box.Qty
cbox.Filled = True
End If
Next
db.SaveChanges()
End If
Return RedirectToAction("Index")
End Function
最后,这里的模型
Public Class HonorBox
<Key> Public Property BoxID As Integer
Public Property AssetID As Nullable(Of Integer)
Public Property Asset As Asset
Public Property BoxType As String
Public Property Hold As Nullable(Of Boolean)
Public Property Filled As Nullable(Of Boolean)
Public Property Qty As Nullable(Of Integer)
End Class