Я не могу понять, почему это не сработает. Все, что я читал (как здесь, так и в Интернете), говорит, что это то, как привязать к списку для редактирования, но у меня ничего не получается. У меня две проблемы:
Элементы формы HTML, выдаваемые представлением, не индексируются (каждый из них называется «Qty» и «BoxID» вместо «[0] .Qty» и «[0] .BoxID»). Все, что я прочитал по этому разделу, говорит, что помощники 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