asp.net-mvc-3 - how - viewbag in view mvc
ViewBag/ViewData Lifecycle (4)
He visto muchas publicaciones sobre cuándo usar ViewBag / ViewData vs ViewModel, pero no he podido encontrar una explicación del ciclo de vida de ViewBag.
Por ejemplo, tengo dos métodos de acción en un controlador:
// POST: /MyModel/Edit/5
[HttpPost]
public ActionResult Edit(MyModel _mymodel){}
y
// GET: /MyModel/Edit/5
public ActionResult Edit(int id){}
Si pongo algunos valores en la ViewBag en el método de acción GET, para configurar algunas etiquetas de Formulario, cuando el usuario hace clic en el botón ''Enviar'' y el formulario se publica en el servidor a través de HTTP POST, los valores ViewBag ya no están dentro el método de acción POST.
¿Puede alguien explicar (o proporcionar una referencia al buen artículo) el ciclo de vida de ViewBag / ViewData?
Desde MSDN - ViewBag: el diccionario de datos de vista dinámica, ViewData: el diccionario para los datos de vista.
Entonces estos / esto es un diccionario para una vista dada. Usted establece sus valores en su acción y los usa en su vista. Como Zach dijo que no regresaría con la solicitud posterior. Puede enviar sus valores de regreso a cualquier acción dada como un campo de formulario, en la cadena de consulta, etc., pero estos valores no estarán disponibles automáticamente como propiedades de VieBag.
La respuesta aceptada aquí realmente no describe el ciclo de vida de ViewBag / ViewData. Es desafortunado que parece no haber documentación clara sobre esto. Sin embargo, en base a esto:
http://blogs.msdn.com/b/varunm/archive/2013/10/03/understanding-of-mvc-page-life-cycle.aspx
Parece que el ciclo de vida es:
Solicitud IIS -> Enrutamiento -> Controlador MVC -> Controlador (con ViewData) -> Ver (con ViewData) -> Eliminación
Por lo tanto, ViewData (que ViewBag simplemente ajusta) se instanciaría realmente con el ControllerContext, al mismo tiempo que TempData se crea una instancia. Esto ocurre unos pocos pasos después del Paso 4: MVC Handler Executes.
Hay un paso interesante más adelante en el que "Si la página tiene ViewData, se configura ViewData" durante el traspaso de Controller a View. ViewData está claramente disponible antes de esto, por lo que establecer no puede significar instanciar. Por el contrario, parece que se transfiere del Controlador (que recuerda no está disponible para una Vista) al ViewContext (el contenedor que proporciona acceso de Vista a ViewBag / ViewData, y Model).
El ViewData presumiblemente se desecha al mismo tiempo que el resto de la Vista.
También es importante tener en cuenta que las vistas MVC se representan desde adentro hacia afuera, por lo que la vista particular y las asignaciones que haga al ViewBag se realizarán del mismo modo en el orden de adentro hacia afuera. Eso significa que algo configurado en una página secundaria Vista estará disponible para un Diseño, pero agregar algo a un ViewBag en un Diseño y luego leerlo en una página secundaria Vista fallará.
Los datos que ingresa en ViewBag / ViewData solo están disponibles durante el ciclo de vida de la solicitud dentro de la cual lo rellenó. MVC no tiene publicaciones posteriores. Si necesita que algo persista en más de una solicitud, debe usar Session.
Aquí hay un artículo decente sobre las diferencias entre ViewData, ViewBag y TempData: http://rachelappel.com/when-to-use-viewbag-viewdata-or-tempdata-in-asp.net-mvc-3-applications
ViewBag
y ViewBag
se usan para el mismo propósito. Se usan para pasar datos de los controladores a la Vista. Cuando les asignamos cualquier dato u objeto, están accesibles en la Vista.
-
ViewData
:ViewData
es un diccionario de objetos y se puede acceder mediante una cadena como clave. -
ViewBag
: utiliza la función dinámica. Permite que un objeto le agregue propiedades dinámicas.