Сохранение значения элемента Selectlist при использовании в для каждого цикла в представлении - PullRequest
0 голосов
/ 15 октября 2011

Часть моего MVC 3 VB.NET имеет представление, которое использует список (модели) и a для каждого в этой модели, чтобы перечислить все содержимое. Проблема в том, что список выбора является частью каждого элемента. Когдазначение выбирается для каждого элемента, оно не отправляется обратно в контроллер вместе с остальными элементами ... Код представления выглядит следующим образом:

@ModelTYPE List(Of xxxxxxx.attendance)


@Code
ViewData("Title") = "Class Attendance Record"
End Code


@Using Html.BeginForm
@<fieldset>

<table>
<tr>
    <th>
        First Name
    </th>
    <th>
        Last Name
    </th>
    <th>
        Registrant ID
    </th>
    <th>
        Course Status
    </th>
    <th>
        Comments
    </th>

</tr>

@For r As Integer = 0 To Model.Count - 1
    Dim i As Integer = r
    @Html.HiddenFor(Function(m) m(i).id)
@<tr>

    <td>
        @Html.DisplayFor(Function(m) m(i).firstName)
        @Html.HiddenFor(Function(m) m(i).firstName)
    </td>.

    <td>
        @Html.DisplayFor(Function(m) m(i).lastName)
         @Html.HiddenFor(Function(m) m(i).lastName)
    </td>
    <td>
        @Html.DisplayFor(Function(m) m(i).reg_id)
         @Html.HiddenFor(Function(m) m(i).reg_id)
    </td>
    <td>
        @Html.DisplayFor(Function(m) m(i).Completed_Class)

        </td>
    <td>
        @Html.DropDownList("Completed_Class", New SelectList(ViewBag.courseStatus, "Status", "Status"), New With {.Completed_Class = "Completed_Class"})
        @Html.HiddenFor(Function(m) m(i).Completed_Class)
    </td>
    <td>
        @Html.TextBoxFor(Function(m) m(i).Comments, New With {.class = "AttenComment"})
         @Html.HiddenFor(Function(m) m(i).Comments)
   </td>
 </tr>
 Next
 </table>
 <p>
     <input type="submit" name="submit" />
    </p>
  </fieldset>

  End Using

Любые идеи, как можно назначить выбранное значениеThe HiddenFor ??

1 Ответ

1 голос
/ 15 октября 2011

Вместо написания циклов я бы порекомендовал вам использовать редактор шаблонов .Например:

@ModelTYPE List(Of xxxxxxx.attendance)

@Code
    ViewData("Title") = "Class Attendance Record"
End Code

@Using Html.BeginForm
    @<fieldset>
        <table>
            <tr>
                <th>First Name</th>
                <th>Last Name</th>
                <th>Registrant ID</th>
                <th>Course Status</th>
                <th>Comments</th>
            </tr>
            @Html.EditorForModel()
        </table>
        <p><input type="submit" name="submit" /></p>
    </fieldset>
End Using

и внутри соответствующего шаблона редактора (~/Views/Shared/EditorTemplates/attendance.vbhtml или ~/Views/SomeController/EditorTemplates/attendance.vbhtml), который будет отображаться для каждого элемента коллекции:

@ModelTYPE xxxxxxx.attendance
@Html.HiddenFor(Function(m) m.id)
@<tr>
    <td>
        @Html.DisplayFor(Function(m) m.firstName)
        @Html.HiddenFor(Function(m) m.firstName)
    </td>
    <td>
        @Html.DisplayFor(Function(m) m.lastName)
        @Html.HiddenFor(Function(m) m.lastName)
    </td>
    <td>
        @Html.DisplayFor(Function(m) m.reg_id)
        @Html.HiddenFor(Function(m) m.reg_id)
    </td>
    <td>
        @Html.DisplayFor(Function(m) m.Completed_Class)
    </td>
    <td>
        @Html.DropDownList("Completed_Class", New SelectList(ViewBag.courseStatus, "Status", "Status"), New With {.Completed_Class = "Completed_Class"})
        @Html.HiddenFor(Function(m) m.Completed_Class)
    </td>
    <td>
        @Html.TextBoxFor(Function(m) m.Comments, New With {.class = "AttenComment"})
        @Html.HiddenFor(Function(m) m.Comments)
    </td>
</tr>

При этомИспользование всех этих скрытых полей очень напоминает мне классическое WebForms ViewState.Тебе это не нужно.Поверь мне, тебе действительно не нужны эти вещи.Используйте поля ввода, если вы разрешаете пользователю что-то изменять (текстовые поля, радио, флажки и т. Д.), Но скрытые поля, давай!Единственное скрытое поле, содержащее идентификатор модели, будет в значительной степени достаточным для действия контроллера, чтобы извлечь соответствующую модель из хранилища данных, из которого она изначально извлекла ее.

Что касается раскрывающегося списка:

@Html.DropDownList("Completed_Class", New SelectList(ViewBag.courseStatus, "Status", "Status"), New With {.Completed_Class = "Completed_Class"})

Вы должны использовать свойство в вашей модели представления для привязки и использования строго типизированной версии:

@Html.DropDownListFor(Function(m) m.CompletedCLass, New SelectList(ViewBag.courseStatus, "Status", "Status"), New With {.Completed_Class = "Completed_Class"})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...