В настоящее время у меня есть ViewModel, который состоит из 2 списков моделей. Отображение содержимого с помощью ViewModel в порядке, однако, когда я пытаюсь отправить сообщение, я получаю исключение с нулевой ссылкой.Ссылка на нуль при попытке опубликовать с ViewModel
public class DashboardViewModel
{
public IList<DashboardModel> dashboard { get; set; }
public IList<WidgetModel> widgets { get; set; }
}
Вот форма на представлении
@using (Html.BeginForm("AddDashboard", "Dashboard", FormMethod.Post))
{
@Html.AntiForgeryToken()
<div class="form-horizontal">
<h4>DashboardModel</h4>
<hr />
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
<div class="form-group">
@Html.LabelFor(model => model.dashboard.Last().DashName, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.dashboard.Last().DashName, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.dashboard.Last().DashName, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
<button type="submit" value="AddDashboard" class="btn btn-primary">Save changes</button>
</div>
</div>
</div>
}
и вот мое действие
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult AddDashboard([Bind(Include = "DashID,DashName,CreatedBy,CreatedDate")] DashboardViewModel dashboardVM)
{
if (ModelState.IsValid)
{
DashboardModel newDashboard = dashboardVM.dashboard.Last();
newDashboard.CreatedBy = User.Identity.GetUserId();
newDashboard.CreatedDate = DateTime.Now;
db.dashboards.Add(newDashboard);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(dashboardVM);
}
Нулевая ссылка происходит в действии AddDashboard я установить контрольную точку и понял, что dashboardVM имеет значение null, свойство приборной панели - null
Не создавайте элементы управления, которые не имеют отношения к вашей модели. Свойство 'dashboard' - это коллекция, поэтому вам нужно сгенерировать элементы управления в цикле' for' (или использовать пользовательский 'EditorTemplate' для типа' DashboardModel') –
Вы не отправляете список назад. Измените действие post, чтобы принять DashboardModel. –
'@ Html.EditorFor (model => model.dashboard.Last(). DashName, ...' не будет работать как '.Last()' является 'IEnumerable' и поэтому является только для чтения. –