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

Respuestas:

388

Utiliza la función dinámica C # 4.0. Alcanza el mismo objetivo que los datos de vista y debe evitarse a favor del uso de modelos de vista fuertemente tipados (de la misma manera que deben evitarse los datos de vista).

Básicamente, reemplaza las cadenas mágicas :

ViewData["Foo"]

con propiedades mágicas :

ViewBag.Foo

para lo cual no tiene seguridad en tiempo de compilación.

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

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

Darin Dimitrov
fuente
11
¿Con qué propósito culpas a Microsoft? Si no hay datos de vista, ¿cómo podríamos vincular la lista desplegable del modelo? (No creo que usar selectlist dentro del modelo sea una buena idea)
Subin Jacob
15
@SubinJacob Realmente deberías hacer una nueva pregunta si quieres una respuesta a esto. Crear una SelectList es definitivamente el camino a seguir para hacer una lista desplegable.
MiniRagnarok
25
Creo que es un poco subjetivo. Los modelos fuertemente tipados son agradables y yada yada, pero para los escenarios en los que rápidamente obtiene una vista en funcionamiento, ViewBag y similares hacen el trabajo más rápido que Controller, View, Model, AutoMapper to ViewModel, etc.
Craig Brett
11
@ Darin, ¿por qué "culpas" a Microsoft por presentar esto? Es solo una herramienta dada a los desarrolladores. Si sabe lo que está haciendo, puede aprovecharlo al máximo. Si no le gusta o siente que es más propenso a errores, simplemente no lo use. :)
Bilal Fazlani
55
¿Cómo sugiere pasar datos entre parciales y diseño? La gente culpa cuando no ven la imagen completa. Me imagino que tiene controladores base y modelos de vista base u objetos estáticos / singletons en todas partes. Adivina qué, mejor aprende a usar los datos de visualización y culpa a ti mismo por usar la herramienta incorrecta para el trabajo.
Bart Calixto
42

Internamente, las propiedades de ViewBag se almacenan como pares de nombre / valor en el diccionario ViewData .

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

(editado 10-8-12) Se sugirió que publique 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 admiten 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 sintaxis algo más simple con la propiedad ViewBag para lograr el mismo propósito. Por ejemplo, en lugar de escribir ViewData ["Mensaje"] = "texto", puede escribir ViewBag.Message = "texto". No necesita definir ninguna clase fuertemente tipada para usar la propiedad ViewBag. Debido a que es una propiedad dinámica, en su lugar puede obtener o establecer propiedades y las resolverá dinámicamente en tiempo de ejecución. Internamente, las propiedades de ViewBag se almacenan como pares de nombre / valor en el diccionario ViewData. (Nota: en la mayoría de las versiones preliminares de MVC 3, la propiedad ViewBag se denominaba propiedad ViewModel).

Rich Bianco
fuente
La pregunta pregunta la diferencia entre ViewDatay ViewBag, no sobre ViewModel.
Matthew Flaschen el
Gracias por el aviso Matthew Flaschen, tuve un error tipográfico en la respuesta y lo arreglé, ahora lee "ViewData" en lugar de ViewModel, lo cual fue un error. :)
Rich Bianco
Ahora es incorrecto. Ninguno fue renombrado como el otro. Ambos todavía existen. Uno es dynamicy apoya ViewBag.Message. Uno usa la ViewData["Message"]sintaxis anterior.
Matthew Flaschen el
1
+1 Pero, ¿de qué fuente estás citando ...? Realmente debería proporcionar un enlace.
Sam
1
Gracias Sam por la sugerencia. He agregado un enlace a la fuente original.
Rich Bianco
34

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 pasa del controlador a la vista. Se utiliza para pasar datos del controlador a la vista correspondiente. La vida corta significa que el valor se vuelve nulo cuando se produce la redirección. Esto se debe a que su objetivo es proporcionar una manera de comunicarse entre los controladores y las vistas. Es un mecanismo de comunicación dentro de la llamada al servidor.

Diferencia entre ViewBag y ViewData:

ViewData es un diccionario de objetos que se deriva 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 conversión de texto para tipos de datos complejos y verificar valores nulos para evitar errores. ViewBag no requiere conversión de texto 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 a la vista

@ViewBag.Name    
@ViewData["Name"]
Arun Prakash
fuente
77
su respuesta indica typecastingpero no mostró cómo se realiza la conversión de texto
Alex
31

ViewData: Requiere conversión de tipos para tipos de datos complejos y verificaciones de 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 Viewes 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
}

<h2>Welcome to Home Page</h2>
This Year Best Employee is!
<h4>@ViewBag.Employee.Name</h4>
<h3>@viewDataEmployee.Name</h3>
Naresh Ravlani
fuente
66
ayúdame a entender pero creo que hay un error. esto <h4>@ViewBag.emp.Name</h4> debería cambiar a<h4>@ViewBag.Employee.Name</h4>
Benny Margalit
24

Todas las respuestas sugieren que ViewBagy / o ViewDataes pasar datos Controllera los Viewsque hay información errónea. ambos son muy útiles para pasar datos de Vistas a Diseño o Parciales a Vistas (o ViewComponents, etc.) No es exclusivo del controlador.

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

<title>@ViewData["Title"] - MyApp</title>

y en cualquier vista

ViewData["Title"] = "Details";

Entonces, para hacer la pregunta: "¿cuál es la diferencia entre ViewBagy ViewData?"

La diferencia más notable es que ViewDataes un diccionario fuertemente tipado, mientras que ViewBages un tipo dinámico.

Tenga en cuenta que los datos dentro ES LO MISMO

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

¿Cuándo usar uno u otro?

  • ViewBagno admite nombres de C # no válidos. no puedes acceder ViewData["Key With Space"]conViewBag
  • ViewBag.Something es dinámico y puede tener problemas al llamar a métodos (como los métodos de extensión) que necesitan conocer el parámetro exacto en el momento de la compilación.
  • ViewBag puede verificar si hay limpiadores sintácticos nulos: ViewBag.Person?.Name
  • ViewDatatiene todas las propiedades de un diccionario como ContainsKey, Addetc., por lo que puede usarlo, ViewData.Add("somekey", "somevalue")tenga en cuenta que puede generar excepciones.
  • El uso ViewDataen vistas necesita TypeCasting mientras ViewBagque no.

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

Normalmente puedes pensar ViewBag.AnyKeyen un alias deViewData["AnyKey"]

Bart Calixto
fuente
14

¿Puedo recomendarle que tampoco lo use?

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

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

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

nootn
fuente
44
Ignorando el principio del "compilador es la primera prueba de unidad", ¿cómo hace que un modelo de vista estáticamente tipado haga que su código sea más verificable que un tipo dinámico? Si bien el requisito de pruebas es más importante en una solución de tipo dinámico, si ambas soluciones implementan el mismo número y tipo de pruebas, no pierde nada.
Darren Lewis
Estoy de acuerdo, es un poco vago. Quizás intellisense está involucrado.
Joshua Ramirez
1
Un ejemplo sería burlarse. Si desea probar la unidad de una acción del controlador, es más fácil crear un objeto "simulado" para pasar y afirmar en lugar de intentar afirmar que se agregó alguna cadena a algún diccionario o que algún campo dinámico está configurado en algún valor: es un concepto similar a los contratos de servicio que tienen un objeto "Solicitud" y un objeto "Respuesta", en lugar de tomar múltiples parámetros.
nootn
¿Cómo pasaría los datos de Ver a Diseño si no los usa? -1
Bart Calixto
¿Cómo es esta una respuesta?
JSON
6

viewdata: es un diccionario que se usa para almacenar datos entre View y el controlador, debe convertir el objeto de datos de vista 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 convertida en su modelo de corressponding antes de usarla en la vista ...

Ahmed Elbatt
fuente
4

A continuación se muestra la diferencia punto a punto sobre ViewData, ViewBag, TempData y Session. Crédito / copiado askforprogram.in , siga el enlace para el ejemplo de código que no he mencionado aquí.

  1. ViewData en MVC

    • ViewData es propiedad de la clase ControllerBase.
    • ViewData es un tipo de objeto de diccionario.
    • ViewData es una colección de diccionario clave-valor.
    • ViewData se introdujo en la versión MVC 1.0.
    • ViewData funciona con .Net Framework 3.5 y superior.
    • Necesita hacer conversión de tipo de código mientras se enumera.
    • El objeto ViewData mantiene los datos solo para la solicitud actual.
  2. ViewBag en MVC

    • ViewBag es propiedad de la clase ControllerBase.
    • ViewBag es un tipo de objeto dinámico.
    • ViewBag es un tipo de objeto.
    • ViewBag se introdujo en la versión MVC 3.0.
    • ViewBag funciona con .Net framework 4.0 y superior.
    • ViewBag utiliza la propiedad y la maneja, por lo que no es necesario realizar la conversión de tipos al enumerar.
    • El objeto ViewBag mantiene los datos solo para la solicitud actual.
  3. TempData en MVC

    • TempData es propiedad de la clase ControllerBase.
    • TempData es un tipo de objeto de diccionario.
    • TempData es una colección de diccionario de valores clave.
    • TempData se introdujo en la versión MVC 1.0.
    • TempData funciona con .Net Framework 3.5 y superior.
    • Necesita hacer conversión de tipo de código mientras se enumera.
    • El objeto TempData se utiliza para datos entre la solicitud actual y la solicitud posterior.
  4. Sesión en MVC

    • La sesión es propiedad del controlador (clase abstracta).
    • La sesión es un tipo de HttpSessionStateBase.
    • La sesión es una colección de diccionario de valor clave.
    • La sesión se introdujo en la versión MVC 1.0.
    • TempData funciona con .Net Framework 1.0 y superior.
    • Necesita hacer conversión de tipo de código mientras se enumera.
    • El objeto de sesión mantiene datos para todas las solicitudes. Válido para todas las solicitudes, nunca caduca.
Nirju
fuente
1

Aunque es posible que no tenga una ventaja técnica para elegir un formato sobre el otro, debe tener en cuenta algunas diferencias importantes entre las dos sintaxis. 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 ["Clave con espacios"], no puede acceder a ese valor usando ViewBag porque el código no se compilará. Otra cuestión clave a tener en cuenta es que no puede pasar valores dinámicos como parámetros a los métodos de extensión. El compilador de C # debe conocer el tipo real de cada parámetro en tiempo de compilación para elegir el método de extensión correcto. Si algún parámetro es dinámico, la compilación fallará. Por ejemplo, este código siempre fallará: @ Html.TextBox ("nombre", ViewBag.Name). Para evitar esto, use ViewData ["Nombre"

usuario2211290
fuente
0
public ActionResult Index()
{
    ViewBag.Name = "Monjurul Habib";
    return View();
}

public ActionResult Index()
{
    ViewData["Name"] = "Monjurul Habib";
    return View();
} 

In View:

@ViewBag.Name 
@ViewData["Name"] 
dilipkumar1007
fuente
0

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

usuario3141962
fuente
0

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

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

ViewBag: es lo suficientemente inteligente como para devolver el tipo exacto de lo que le ha asignado, no importa el tiempo 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> products = new List<Products>();
            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.

<ul>
            @foreach (WebApplication1.Controllers.Products item in ViewBag.Countries)
            {
            <li>@item.productId &nbsp;&nbsp;&nbsp;@item.productName</li>
            }
        </ul>

Pantalla de salida.

ingrese la descripción de la imagen aquí

Bhanu Pratap
fuente
0

Ver datos

  1. ViewData se utiliza para pasar datos del controlador para ver
  2. ViewData se deriva de la clase ViewDataDictionary y es básicamente un objeto Dictionary, es decir, Keeys and Values, donde Keys son String, mientras que los valores serán objetos.
  3. Se requiere el tipcasting de datos al recuperar los datos de ViewData debido a su tipo de datos Object y también la comprobación de valor nulo antes de la conversión de tipos, de lo contrario se romperá la aplicación. Si se produce la redirección, su valor se vuelve nulo. Lea la diferencia completa entre TempData ViewData y View Bag

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

Jatin Phulera
fuente
0
Ver datos
  1. ViewData se utiliza para pasar datos del controlador para ver
  2. Se deriva de la clase ViewDataDictionary
  3. Está disponible solo para la solicitud actual
  4. Requiere conversión de texto para tipos de datos complejos y verifica valores nulos para evitar errores
  5. Si se produce la 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 se produce la redirección, su valor se vuelve nulo
  5. No requiere conversión de texto para tipos de datos complejos
Er Pravin Suthar
fuente
0

Aquí ViewData y ViewBag tanto son datos pase usado de Controlador de Vista .

1. ViewData

- ViewData es un objeto de diccionario que se deriva de la clase ViewDataDictonary .

- Los datos solo permiten una solicitud, los valores de ViewData se borran cuando se produce el redireccionamiento de la página.

- El valor de ViewData debe escribirse cate antes de su uso.

Ejemplo: en el controlador

public ActionResult PassingDatatoViewWithViewData()
{
      ViewData["Message"] = "This message shown in view with the ViewData";
      return View();
}

En vista

@ViewData["Message"];

- Con ViewData hay un par como Key y Value , Message es Key y en coma invertido el valor es Value.

- Los datos son simples, por lo que no podemos usar la conversión de tipos aquí si los datos son complejos y luego usar la conversión de tipos.

public ActionResult PassingDatatoViewWithViewData()
{
      var type= new List<string>
    {
        "MVC",
        "MVP",
        "MVVC"
    };
    ViewData["types"] = type;
    return View();
}

- En View los datos se pueden extraer como

<ul>
        @foreach (var items in (List<string>)ViewData["types"])
        {
         <li>@items</li>
        }
  </ul>

2. ViewBag

- ViewBag usa la característica dinámica. Contenedor ViewBag alrededor de ViewData.

- En ViewBag se requiere el tipo de conversión.

- Igual que ViewData, si se produce la redirección, el valor se vuelve nulo.

Ejemplo:

public ActionResult PassingDatatoViewWithViewBag()
{
          ViewData.Message = "This message shown in view with the ViewBag";
          return View();
}

En vista

@ViewBag.vbMessage

--Para tipos complejos use ViewBag

public ActionResult PassingDatatoViewWithViewBag()
{
          var type= new List<string>
        {
            "MVC",
            "MVP",
            "MVVC"
        };
        ViewBag.types = type;
        return View();
 }

- En View los datos se pueden extraer como

<ul>
       @foreach (var items in ViewBag.types)
       {
         <li>@items</li>
       }
</ul>

- la principal diferencia es que ViewBag no requiere conversión de texto, pero ViewData requiere conversión de texto.

Brijesh Mavani
fuente
-1

ViewBag y ViewData son dos medios que se utilizan para pasar información del controlador para ver en ASP.Net MVC. El objetivo de utilizar ambos mecanismos es proporcionar la comunicación entre el controlador y la Vista. Ambos tienen una vida corta, es decir, 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 redirigido 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 ambos aspectos de implementación, encontraremos que ViewData es una estructura de datos de diccionario: Diccionario de objetos derivados de ViewDataDictionary y accesible mediante cadenas como claves para estos valores, mientras que ViewBag utiliza las características dinámicas introducidas en C # 4.0 y Es una propiedad dinámica.

2.) Al acceder a los valores de ViewData, debemos escribir los valores (tipos de datos) ya que se almacenan como Objetos en el diccionario ViewData, pero no es necesario si accedemos al valor 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 establecer y acceder de la siguiente manera: Configuración de ViewData de la siguiente manera:

ViewData["Name"] = "Value";

y acceder a un valor como este

 @ViewData["Name"] 

Para más detalles haga clic aquí:

Abhishek Gahlout
fuente
2
lo siento, voté en contra pero esta respuesta requiere varios párrafos para no decir nada útil. Lo útil que falta en la respuesta aceptada sería la oración "viewbag es una envoltura dinámica alrededor de viewdata" que aprendí de rachelappel.com/…
Chris F Carroll