Привязка модели MVC для редактирования списка не работает

Я не могу понять, почему это не сработает. Все, что я читал (как здесь, так и в Интернете), говорит, что это то, как привязать к списку для редактирования, но у меня ничего не получается. У меня две проблемы:

  1. Элементы формы HTML, выдаваемые представлением, не индексируются (каждый из них называется «Qty» и «BoxID» вместо «[0] .Qty» и «[0] .BoxID»). Все, что я прочитал по этому разделу, говорит, что помощники HTML.EditorFor и HiddenFor должны уловить это автоматически.

  2. Даже когда я вручную изменяю представление, чтобы выдать правильный 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

person Roger Hicks    schedule 25.09.2014    source источник


Ответы (1)


Чтобы связующее устройство модели могло подобрать его, тип модели должен иметь тип List, а не IEnumerable.

Изменение его на это будет работать:

@ModelType List(of HonorBox)
person hutchonoid    schedule 25.09.2014
comment
@ Roger-Hicks никаких проблем. :) - person hutchonoid; 25.09.2014