#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 . Они изменили идентификаторы всех записей в таблицах и, следовательно, повредили мою модель.