.net para - ¿Cuál es la diferencia entre ViewData y ViewBag?




between difference (13)

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.

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


Todas las respuestas sugieren que ViewBag y / o ViewData deben pasar los datos del Controller a las Views cual es 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 el ejemplo de asp.net predeterminado tiene 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 ViewBag y ViewBag ?"

La diferencia más notable es que ViewBag es un diccionario fuertemente ViewBag mientras que ViewBag es un tipo dinámico.

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 # no válidos. no puede acceder a ViewData["Key With Space"] con ViewBag
  • ViewBag.Something es dinámico y puede tener problemas al llamar a métodos (como métodos de extensión) que necesitan saber el parámetro exacto en el momento de la compilación.
  • ViewBag puede verificar si hay limpiadores sintácticos de nulos: ViewBag.Person?.Name
  • ViewData tiene todas las propiedades de un diccionario como ContainsKey , Add , etc., por lo que puede usar ViewData.Add("somekey", "somevalue") tenga en cuenta que puede ViewData.Add("somekey", "somevalue") excepciones.
  • El uso de ViewData en las vistas necesita TypeCasting, mientras que ViewBag no.

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

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


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


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>

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).


ViewBag y ViewData son dos medios que se utilizan para pasar información del controlador para verla en ASP.Net MVC. El objetivo de usar ambos mecanismos es proporcionar la comunicación entre el controlador y la vista. Ambos tienen una vida útil corta, el valor de ambos se vuelve nulo una vez que se produce la redirección, es decir, una vez que la página se 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 ambas implementaciones, veremos que ViewData es una estructura de datos de diccionario - Diccionario de objetos derivado de ViewDataDictionary y accesible mediante cadenas como claves para estos valores, mientras que ViewBag utiliza las funciones dinámicas introducidas en C # 4.0 y Es una propiedad dinámica.

2.) Al acceder a los valores de ViewData, debemos encasillar los valores (tipos de datos), ya que se almacenan como Objetos en el diccionario de ViewData, pero no hay tal necesidad 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 configurar y acceder de la siguiente manera: Configuración de ViewData de la siguiente manera:

ViewData["Name"] = "Value";

y accediendo a valores como este

 @ViewData["Name"] 

Para más detalles haga clic aquí:


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


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 la redirección, entonces su valor se vuelve nulo
ViewBag
  1. ViewBag también se usa para pasar datos del controlador a la vista correspondiente
  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 la redirección, entonces su valor se vuelve nulo
  5. No requiere encasillado para tipos de datos complejos


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 te mueves 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 del servidor.

Diferencia entre ViewBag y ViewData:

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

Ejemplo de ViewBag y ViewData:

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"]

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.


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

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

In View:

@ViewBag.Name 
@ViewData["Name"] 

Ambos son constantes, pero una constante está disponible también en tiempo de compilación. Esto significa que un aspecto de la diferencia es que puede usar variables const como entrada para atribuir constructores, pero no variables de solo lectura.

Ejemplo:

public static class Text {
  public const string ConstDescription = "This can be used.";
  public readonly static string ReadonlyDescription = "Cannot be used.";
}

public class Foo 
{
  [Description(Text.ConstDescription)]
  public int BarThatBuilds {
    { get; set; }
  }

  [Description(Text.ReadOnlyDescription)]
  public int BarThatDoesNotBuild {
    { get; set; }
  }
}




.net asp.net-mvc-3 difference viewbag viewdata