Подтвердить что ты не робот

Жизненный цикл ViewBag/ViewData

Я видел много сообщений о том, когда использовать ViewBag/ViewData vs ViewModel, но мне не удалось найти объяснение жизненного цикла ViewBag.

Например, у меня есть два метода Action в одном контроллере:

// POST: /MyModel/Edit/5
[HttpPost]
public ActionResult Edit(MyModel _mymodel){}

и

// GET: /MyModel/Edit/5
public ActionResult Edit(int id){}

Если я поместил некоторые значения в ViewBag в методе действия GET, чтобы настроить некоторые метки меток, тогда, когда пользователь нажимает кнопку "Отправить", и форма отправляется обратно на сервер через HTTP POST, значения ViewBag уже не в методе действия POST.

Может ли кто-нибудь объяснить (или предоставить ссылку на хорошую статью) жизненный цикл ViewBag/ViewData?

4b9b3361

Ответ 1

Данные, которые вы добавили в ViewBag/ViewData, доступны только в течение жизненного цикла запроса, в котором вы его заполнили. У MVC нет почтовых сообщений. Если вам нужно что-то, чтобы упорствовать более чем на одном запросе, вы должны использовать Session.

Вот достойная статья о различиях между ViewData, ViewBag и TempData: http://rachelappel.com/when-to-use-viewbag-viewdata-or-tempdata-in-asp.net-mvc-3-applications

Ответ 2

Принятый ответ здесь не описывает жизненный цикл ViewBag/ViewData. Несчастливо, по-видимому, нет четкой документации об этом. Однако, основываясь на этом:

http://blogs.msdn.com/b/varunm/archive/2013/10/03/understanding-of-mvc-page-life-cycle.aspx

Казалось бы, жизненный цикл:

Запрос IIS → Маршрутизация → Обработчик MVC → Контроллер (с ViewData) → Просмотр (с ViewData) → Утилизация

Таким образом, ViewData (который ViewBag просто обертывает) фактически будет создан с помощью ControllerContext, в то же время создается TempData. Это происходит через несколько шагов после шага 4: Выполняется обработчик MVC.

Там интересный шаг позже, когда "Если на странице есть ViewData, ViewData устанавливается" во время передачи обслуживания от Controller to View. ViewData явно доступна до этого, поэтому набор не может означать создание экземпляра. По-видимому, он означает, что он передается из контроллера (который не может быть доступен для представления) в ViewContext (контейнер, предоставляющий представление View для ViewBag/ViewData и Model).

ViewData предположительно удаляется одновременно с остальной частью View.

Важно также отметить, что MVC-представления визуализируются изнутри, поэтому конкретный вид и любые его назначения в ViewBag будут происходить аналогично в порядке внутри снаружи. Это означает, что что-то, установленное на дочерней странице View, будет доступно для макета, но добавление чего-то в ViewBag в макет, а затем чтение его на дочерней странице View не удастся.

Ответ 3

От MSDN - ViewBag: словарь данных динамического представления, ViewData: словарь для просматривать данные.

Таким образом, это/это словарь для данного вида. Вы устанавливаете свои значения в своем действии и используете его в своем представлении. Как сказал Зак, он не возвращается с последующей просьбой. Вы можете отправить свои значения обратно на любое заданное действие в виде поля формы, в querystring и т.д., Но эти значения не будут автоматически доступны как свойства VieBag.

Ответ 4

ViewBag и ViewData используются для этой же цели. Они используются для передачи данных из контроллеров в представление. Когда мы присваиваем им любые данные или объекты, они доступны в представлении.

  • ViewData: ViewData - словарь объектов, и они доступный по строке как ключ.
  • ViewBag: Использует динамическую функцию. Он позволяет добавить объект динамические свойства.