.net - usar - what is the difference between viewbag and viewdata




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

¿Te puedo recomendar que no uses tampoco?

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 "viewbag" o "viewdata" aleatorios, entonces las pruebas automatizadas son muy difíciles.

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

Vi el ViewBag en MVC 3. ¿En qué se diferencia de ViewData en MVC 2?


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 solo funciona 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 compilará. Otro tema clave a considerar 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 el momento de la 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 solucionar esto, use ViewData ["Name"] o lance la va



Las propiedades internas 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 denominó 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 publique la fuente de la 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 con retraso. 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 es necesario que defina ninguna clase fuertemente tipificada para usar la propiedad ViewBag. Debido a que es una propiedad dinámica, 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 denominó propiedad ViewModel).


Una de las principales diferencias que noté entre ViewData y ViewBag es:

ViewData: devolverá el objeto, no importa lo que haya asignado en este y necesita volver a encasillar 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 tipo simple (es decir, int, cadena, etc.) o 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.


Utiliza la característica dinámica C # 4.0. Logra el mismo objetivo que viewdata y debe evitarse en favor de utilizar modelos de vista fuertemente tipados (de la misma manera que debe evitarse viewdata).

Así que básicamente reemplaza cadenas mágicas :

ViewData["Foo"]

con propiedades mágicas :

ViewBag.Foo

Por lo que no tienes tiempo de compilación de seguridad.

Sigo culpando a Microsoft por la introducción de este concepto en MVC.

El nombre de las propiedades son mayúsculas y minúsculas.


ViewData : es una conversión de tipos 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
}

<h2>Welcome to Home Page</h2>
This Year Best Employee is!
<h4>@ViewBag.Employee.Name</h4>
<h3>@viewDataEmployee.Name</h3>

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, claves y valores donde las claves son cadenas, mientras que los valores serán objetos.
  3. Se requiere la difusión de datos de datos al recuperar los datos de ViewData debido a su tipo de datos de Objeto y también a la comprobación de valores nulos antes de la conversión de tipos, de lo contrario, se interrumpirá la aplicación. Si se produce una 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


viewdata: es un diccionario que se usa para almacenar datos entre la vista y el controlador, es necesario convertir el objeto de datos de la vista a su modelo correspondiente en la vista para poder recuperar los datos de la misma ...

ViewBag: es una propiedad dinámica similar en su trabajo a los datos de vista. Sin embargo, es mejor porque no es necesario convertirla en su modelo correspondiente antes de usarla 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"] 




viewdata