Не удается заполнить ViewModel

Проект MVC3.

У меня есть несколько классов: учетная запись, адрес, телефон и т. д., которые я настроил в модели представления.

namespace ViewModels
{
  public class AccountVM
  {
    public Account Account { get; set; }
    public Address Address { get; set; }
    public Phone Phone { get; set; }       }

В действии контроллера GET я просто вызываю представление

  public ActionResult Create()
  { return View(); }

В представлении я передаю модель представления

@model AccountVM

Затем я использую @Html.EditorFor, чтобы заполнить все поля и успешно передать их в действие POST и создать записи в базе данных. Так что весь этот код работает.

@Html.EditorFor(z => z.Account.Number)

Проблема возникает, когда я пытаюсь предварительно заполнить некоторые свойства. Я делаю следующее в действии GET.

    public ActionResult Create()
    { var viewModel = new AccountVM();
      viewModel.Account.Number = 1000000;
      return View(viewModel); }

Код проходит Intellisense, но при запуске я получаю сообщение об ошибке «NullReferenceException не было обработано пользовательским кодом — ссылка на объект не указывает на экземпляр объекта».

Я получаю ту же ошибку, если пытаюсь заполнить код в представлении.

@{ Model.Account.Number = 1000000; }

Мне нужно иметь возможность программно заполнять свойства как в контроллере, так и в представлении. Я прочитал несколько сообщений SO о том, как заполнить модель представления в контроллере, и смоделировал на них свой код, но по какой-то причине мой код не работает. Что я здесь делаю неправильно? Как мне это сделать как в контроллере, так и в представлении? Я понимаю, что объекты имеют значение null при создании, но не могу понять, как это обойти.

Спасибо


person Joe    schedule 30.07.2012    source источник


Ответы (1)


Вы создали виртуальную машину, но не ее свойство Account... попробуйте следующее:

public ActionResult Create()
{
    var viewModel = new AccountVM();
    viewModel.Account = new Account();
    viewModel.Account.Number = 1000000;
    return View(viewModel);
}

То же самое касается вида:

@{
    if (Model.Account == null) {
        Model.Account = new Account();
    }
    Model.Account.Number = 1000000;
}

Хотя есть несколько раз, когда это, вероятно, относится к представлению. Это похоже на то, что вместо этого следует установить в контроллере.

person Glen Hughes    schedule 30.07.2012
comment
барабанная дробь. На самом деле я уже сделал это, но получил ошибку, а затем отклонился в сторону при устранении неполадок (должно быть, это была опечатка). Это то, что необходимо сделать. Спасибо, что вернул меня в нужное русло. Я также обнаружил, что для передачи любых значений, установленных в контроллере, в модель, отправленную в действие POST, вам необходимо использовать @Html.HiddenFor для каждого свойства в форме ввода в представлении. @Html.HiddenFor(z => z.Account.Number) - person Joe; 31.07.2012