¿Cuál es la diferencia entre ViewData y ViewBag?

Vi ViewBag en MVC 3. ¿Cómo es eso diferente a ViewData en MVC 2?

    Utiliza la función dinámica C # 4.0. Alcanza el mismo objective que viewdata y debe evitarse a favor del uso de modelos de vista fuertemente tipados (de la misma forma que deberían evitarse los datos de vista).

    Entonces, básicamente, reemplaza las cadenas mágicas :

     ViewData["Foo"] 

    con propiedades mágicas :

     ViewBag.Foo 

    para lo cual no tiene seguridad de tiempo de comstackción.

    Sigo culpando a Microsoft por haber introducido este concepto en MVC.

    El nombre de las propiedades distingue entre mayúsculas y minúsculas.

    Las propiedades ViewBag internas se almacenan como pares nombre / valor en el diccionario ViewData .

    Nota: en la mayoría de las versiones preliminares de MVC 3, la propiedad ViewBag recibió el nombre de ViewModel como se indica en este fragmento de las notas de la versión de MVC 3:

    (editado el 10-8-12) Se sugirió que publicara la fuente de esta información que publiqué, aquí está la fuente: http://www.asp.net/whitepapers/mvc3-release-notes#_Toc2_4

    Los controladores MVC 2 son compatibles con una propiedad ViewData que le permite pasar datos a una plantilla de vista utilizando una API de diccionario enlazada tarde. En MVC 3, también puede usar una syntax más simple con la propiedad ViewBag para lograr el mismo propósito. Por ejemplo, en lugar de escribir ViewData [“Message”] = “text”, puede escribir ViewBag.Message = “text”. No es necesario definir ninguna clase fuertemente tipada para usar la propiedad ViewBag. Debido a que es una propiedad dinámica, en su lugar solo puede obtener o establecer propiedades y las resolverá dinámicamente en tiempo de ejecución. Internamente, las propiedades ViewBag se almacenan como pares nombre / valor en el diccionario ViewData. (Nota: en la mayoría de las versiones preliminares de MVC 3, la propiedad ViewBag recibió el nombre de propiedad ViewModel).

    ViewBag vs ViewData en MVC

    http://royalarun.blogspot.in/2013/08/viewbag-viewdata-tempdata-and-view.html

    Similitudes entre ViewBag y ViewData:

    Ayuda a mantener los datos cuando se mueve del controlador a la vista. Se usa para pasar datos del controlador a la vista correspondiente. La vida corta significa que el valor se vuelve nulo cuando ocurre la redirección. Esto se debe a que su objective es proporcionar una forma de comunicarse entre controladores y vistas. Es un mecanismo de comunicación dentro de la llamada al servidor.

    Diferencia entre ViewBag y ViewData:

    ViewData es un diccionario de objetos derivado de la clase ViewDataDictionary y accesible mediante cadenas como claves. ViewBag es una propiedad dinámica que aprovecha las nuevas características dinámicas en C # 4.0. ViewData requiere encasillamiento para tipos de datos complejos y verificar valores nulos para evitar errores. ViewBag no requiere conversión de tipos para tipos de datos complejos.

    ViewBag & ViewData Ejemplo:

     public ActionResult Index() { ViewBag.Name = "Arun Prakash"; return View(); } public ActionResult Index() { ViewData["Name"] = "Arun Prakash"; return View(); } 

    Llamando en la vista

     @ViewBag.Name @ViewData["Name"] 

    ViewData : es una conversión de tipo requerida para tipos de datos complejos y verifica valores nulos para evitar errores.

    ViewBag : no requiere conversión de tipos para tipos de datos complejos.

    Considere el siguiente ejemplo:

     public class HomeController : Controller { public ActionResult Index() { var emp = new Employee { EmpID=101, Name = "Deepak", Salary = 35000, Address = "Delhi" }; ViewData["emp"] = emp; ViewBag.Employee = emp; return View(); } } 

    Y el código para View es el siguiente:

     @model MyProject.Models.EmpModel; @{ Layout = "~/Views/Shared/_Layout.cshtml"; ViewBag.Title = "Welcome to Home Page"; var viewDataEmployee = ViewData["emp"] as Employee; //need type casting } 

    Welcome to Home Page

    This Year Best Employee is!

    @ViewBag.Employee.Name

    @viewDataEmployee.Name

    Todas las respuestas sugieren que ViewBag y / o ViewData pasan datos del Controller a Views cual es información errónea. ambos son muy útiles para pasar datos de Vistas a Diseño o Parcial a Vistas (o ViewComponents, etc.) No es exclusivo del controlador.

    como la muestra predeterminada de asp.net tiene esto en la página de diseño:

     @ViewData["Title"] - MyApp 

    y en cualquier vista

     ViewData["Title"] = "Details"; 

    Entonces, a hacer la pregunta: “¿ ViewBag es la diferencia entre ViewBag y ViewBag ?”

    La diferencia más notable es ViewData es un diccionario fuertemente ViewBag mientras que ViewBag es un tipo dynamic.

    Tenga en cuenta que los datos dentro ES EL MISMO

     ViewData["Title"] = "MyTitle"; ViewBag.Title; // returns "MyTitle"; 

    Cuándo usar uno u otro?

    • ViewBag no admite nombres de C # válidos. no puedes acceder a ViewData["Key With Space"] con ViewBag
    • ViewBag.Something es dynamic y puede tener problemas al llamar a métodos (como métodos de extensión) que necesitan conocer el parámetro exacto en tiempo de comstackción.
    • ViewBag puede verificar limpiadores sintácticos nulos: ViewBag.Person?.Name
    • ViewData tiene todas las propiedades de un diccionario como ContainsKey , Add , etc. para que pueda usar ViewData.Add("somekey", "somevalue") tenga en cuenta que podría arrojar excepciones.
    • El uso de ViewData en vistas necesita TypeCasting mientras que ViewBag no.

    Conocer las sutiles diferencias, usar uno u otro es mucho más una preferencia de gusto.

    Normalmente puede pensar en ViewBag.AnyKey a un alias de ViewData["AnyKey"]

    ¿Puedo recomendarte no usar ninguno?

    Si desea “enviar” datos a su pantalla, envíe un objeto fuertemente tipificado (AKA ViewModel) porque es más fácil de probar.

    Si se vincula a algún tipo de “Modelo” y tiene elementos aleatorios “viewbag” o “viewdata”, entonces las pruebas automatizadas son muy difíciles.

    Si está utilizando estos, considere cómo podría reestructurarse y simplemente usar ViewModels.

    Hay algunas diferencias sutiles que significan que puede usar ViewData y ViewBag de maneras ligeramente diferentes de la vista. Una ventaja se describe en esta publicación http://weblogs.asp.net/hajan/archive/2010/12/11/viewbag-dynamic-in-asp-net-mvc-3-rc-2.aspx y muestra que el casting se puede evitar en el ejemplo utilizando ViewBag en lugar de ViewData.

    viewdata: es un diccionario que se utiliza para almacenar datos entre la vista y el controlador; es necesario convertir el objeto de datos de visualización en su modelo correspondiente en la vista para poder recuperar datos de él …

    ViewBag: es una propiedad dinámica similar en su funcionamiento a los datos de la vista. Sin embargo, es mejor porque no necesita ser reemplazado por su modelo correspondiente antes de usarlo en la vista …

     public ActionResult Index() { ViewBag.Name = "Monjurul Habib"; return View(); } public ActionResult Index() { ViewData["Name"] = "Monjurul Habib"; return View(); } In View: @ViewBag.Name @ViewData["Name"] 

    De esta forma podemos hacer que use los valores para pasar la información entre el controlador a otra página con TEMP DATA

    Aunque puede que no tenga una ventaja técnica para elegir un formato sobre el otro, debe tener en cuenta algunas diferencias importantes entre las dos syntax. Una diferencia obvia es que ViewBag funciona solo cuando la clave a la que está accediendo es un identificador de C # válido. Por ejemplo, si coloca un valor en ViewData [“Key With Spaces”], no puede acceder a ese valor usando ViewBag porque el código no se comstackrá. Otro aspecto clave a considerar es que no puede pasar valores dynamics como parámetros a los métodos de extensión. El comstackdor de C # debe conocer el tipo real de cada parámetro en tiempo de comstackción para elegir el método de extensión correcto. Si algún parámetro es dynamic, la comstackción fallará. Por ejemplo, este código siempre fallará: @ Html.TextBox (“nombre”, ViewBag.Name). Para solucionar esto, use ViewData [“Name”] o invoque va

    Una diferencia principal que noté entre ViewData y ViewBag es:

    ViewData: devolverá el objeto, no importa lo que haya asignado en esto y necesite volver a encasillar nuevamente al tipo original.

    ViewBag: es lo suficientemente inteligente como para devolver el tipo exacto de lo que le ha asignado, no importa el tiempo en que haya asignado el tipo simple (es decir, int, cadena, etc.) o el tipo complejo.

    Ej .: código del controlador.

      namespace WebApplication1.Controllers { public class HomeController : Controller { public ActionResult Index() { Products p1 = new Products(); p1.productId = 101; p1.productName = "Phone"; Products p2 = new Products(); p2.productId = 102; p2.productName = "laptop"; List products = new List(); products.Add(p1); products.Add(p2); ViewBag.Countries = products; return View(); } } public class Products { public int productId { get; set; } public string productName { get; set; } } } 

    Ver código.

     
      @foreach (WebApplication1.Controllers.Products item in ViewBag.Countries) {
    • @item.productId    @item.productName
    • }

    Pantalla de salida.

    enter image description here

    Ver datos

    1. ViewData se usa para pasar datos del controlador a la vista
    2. ViewData se deriva de la clase ViewDataDictionary y es básicamente un objeto de diccionario, es decir, Keys y Values, donde Keys son String, mientras que los valores serán objetos.
    3. Se requiere el formato de datos al recuperar los datos de ViewData debido a su tipo de datos de Objeto y también la verificación de valor nulo antes de la conversión de tipos, de lo contrario se romperá la aplicación. Si ocurre una redirección, su valor se vuelve nulo. Lee la diferencia completa entre TempData ViewData y View Bag.

    http://www.gurujipoint.com/2017/09/view-data-viewbag-and-tempdata.html

    Ver datos

    1. ViewData se usa para pasar datos del controlador a la vista
    2. Se deriva de la clase ViewDataDictionary
    3. Está disponible solo para la solicitud actual
    4. Requiere encasillamiento para tipos de datos complejos y verifica valores nulos para evitar errores
    5. Si ocurre una redirección, su valor se vuelve nulo

    ViewBag

    1. ViewBag también se usa para pasar datos del controlador a la vista respectiva
    2. ViewBag es una propiedad dinámica que aprovecha las nuevas características dinámicas en C # 4.0
    3. También está disponible solo para la solicitud actual
    4. Si ocurre una redirección, su valor se vuelve nulo
    5. No requiere encasillamiento para tipos de datos complejos

    ViewBag y ViewData son dos medios que se utilizan para pasar información del controlador para ver en ASP.Net MVC. El objective de usar ambos mecanismos es proporcionar la comunicación entre el controlador y la Vista. Ambos tienen una vida corta que es el valor de ambos se vuelve nulo una vez que se ha producido la redirección, es decir, una vez que la página ha sido redirigida desde la página de origen (donde establecemos el valor de ViewBag o ViewData) a la página de destino, tanto ViewBag como ViewData se vuelve nulo.

    A pesar de tener estas similitudes, ambos (ViewBag y ViewData) son dos cosas diferentes si hablamos de la implementación de ambos. Las diferencias son las siguientes:

    1.) Si analizamos ambas implementaciones, veremos que ViewData es una estructura de datos del diccionario – Diccionario de Objetos derivado de ViewDataDictionary y accesible usando cadenas como Claves para estos valores, mientras que ViewBag hace uso de las características dinámicas introducidas en C # 4.0 y es una propiedad dinámica

    2.) Al acceder a los valores de ViewData, necesitamos encasillar los valores (tipos de datos) ya que están almacenados como Objetos en el diccionario ViewData, pero no existe tal necesidad si estamos accediendo al valor th en el caso de ViewBag.

    3.) En ViewBag podemos establecer el valor de esta manera:

      ViewBag.Name = "Value"; 

    y puede acceder de la siguiente manera:

      @ViewBag.Name 

    Mientras que en el caso de ViewData los valores se pueden configurar y acceder de la siguiente manera: Configuración de ViewData de la siguiente manera:

     ViewData["Name"] = "Value"; 

    y accediendo a un valor como este

      @ViewData["Name"] 

    Para más detalles, haga clic aquí: