2015-05-20 2 views
0

В настоящее время у меня есть 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

+1

Не создавайте элементы управления, которые не имеют отношения к вашей модели. Свойство 'dashboard' - это коллекция, поэтому вам нужно сгенерировать элементы управления в цикле' for' (или использовать пользовательский 'EditorTemplate' для типа' DashboardModel') –

+1

Вы не отправляете список назад. Измените действие post, чтобы принять DashboardModel. –

+0

'@ Html.EditorFor (model => model.dashboard.Last(). DashName, ...' не будет работать как '.Last()' является 'IEnumerable' и поэтому является только для чтения. –

ответ

0

Ваше HttpPost действие приема DashboardViewModel, который внутри содержит, наряду с другими свойствами, коллекция DashboardModel.

Однако вы не проходите мимо ничего, кроме одного DashboardModel.

Update ваши действия, чтобы принять DashboardModel вместо:

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult AddDashboard([Bind(Include = "DashID,DashName,CreatedBy,CreatedDate")] DashboardModel dashboardVM) 
{ 
    ... 
} 

Примечание: [Bind] свойства могут потребоваться корректировка; вы не указали определение класса DashboardModel.

2

Ваш атрибут [Bind] c ausing dashboardwidgets) свойство вашей модели просмотра останется пустой, так как вы не включили dashboard в список Include.

Попробуйте удалить [Bind] из вашего параметра действия и поместить его на самом DashboardModel:

[Bind(Include = "DashID,DashName,CreatedBy,CreatedDate")] 
public class DashboardModel 
{ 
    // ... 
} 

См MSDN

+0

Я выполнил ваши инструкции, однако это, похоже, не помогло решить мою проблему. – Johnathon64

+0

Кажется, что это только часть проблемы, другая проблема связана с вашим использованием 'EditorFor()'. Посмотрите на это позже – haim770

Смежные вопросы