MVC3: пакетное редактирование посещаемости и передача модели действию проверки

#asp.net-mvc-3 #model

#asp.net-mvc-3 #Модель

Вопрос:

У меня есть представление Index.cshtml:

 @model AttendenceModel
@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}
@using (Html.BeginForm("VisOppsummering", "Attendences", new { AttendenceModel = Model }, FormMethod.Post))
{
    @Html.DisplayFor(m => m.ClassName)
    @Html.EditorFor(m => m.Attendences)
    <button type="submit">Next</button>
}
  

и посещаемость шаблона редактора.cshtml:

 @model Attendence

@Html.DisplayFor(m => m.Student.Name)
@Html.RadioButtonFor(m => m.Attended, true, new { id = "attendence" })
  

Учителя могут отметить всех учащихся, которые посещали школу, а затем передать измененную модель действию «Обзор», где они могут просмотреть всех посещенных и не посещенных учащихся и отправить. Я хочу использовать для этого наилучшую практику MVC. AttendenceModel имеет несколько свойств и общий список посещаемости, который называется List.

Я безуспешно пытался следовать. Модель пуста.:

 [HttpPost]
public ActionResult Review(AttendenceModel model)
{
   if (TryUpdateModel(model))
   {
      return View(model);
   }
}
  

Ответ №1:

Следующий аргумент вашему BeginForm помощнику не имеет смысла:

 new { AttendenceModel = Model }
  

вы не можете передавать сложные объекты, подобные этому. Только простые скалярные значения. Вы могли бы использовать скрытые поля в своей форме для всех свойств, которые нельзя редактировать, и видимые поля ввода для других. Или еще лучше: используйте модель просмотра, которая будет содержать только свойства, которые можно редактировать в форме, и дополнительный идентификатор, который позволит вам извлекать исходную модель из базы данных и с помощью TryUpdateModel метода обновлять только свойства, которые были частью запроса POST:

 [HttpPost]
public ActionResult Review(int id)
{
    var model = Repository.GetModel(id);
    if (TryUpdateModel(model))
    {
        return View(model);
    }
    ...
}
  

что касается представления, это стало бы:

 @model AttendenceViewModel
@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}
@using (Html.BeginForm("Review", "SomeControllerName"))
{
    @Html.HiddenForm(x => x.Id)
    @Html.DisplayFor(m => m.ClassName)
    @Html.EditorFor(m => m.Attendences)
    <button type="submit">Next</button>
}
  

Комментарии:

1. Большое спасибо за вашу помощь! Мой код был на самом деле правильным. Изначально я пытался, @using (Html.BeginForm("Review", "Attendences", FormMethod.Post)) но модель в public ActionResult Review(AttendenceModel model) всегда была пустой. Причиной всех моих проблем на самом деле было datatables.net . Они изменили идентификаторы всех записей в таблицах и, следовательно, повредили мою модель.