ViewBag / ViewData Lifecycle - PullRequest
       20

ViewBag / ViewData Lifecycle

36 голосов
/ 08 февраля 2012

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

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

// 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?

Ответы [ 4 ]

39 голосов
/ 08 февраля 2012

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

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

9 голосов
/ 28 января 2014

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

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

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

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

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

Позже есть интересный шаг, когда «Если у страницы есть ViewData, ViewData устанавливается» во время передачи обслуживания от контроллера к представлению.До этого данные ViewData были доступны, поэтому set не может означать создание экземпляра.Похоже, вместо этого это означает, что он передается из Контроллера (который помнит, что он недоступен для View) в ViewContext (контейнер, который обеспечивает доступ View к ViewBag / ViewData и Model).

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

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

2 голосов
/ 08 февраля 2012

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

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

0 голосов
/ 23 июля 2012

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

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