Vi el ViewBag
en MVC 3. ¿Cómo es eso diferente que ViewData
en MVC 2?
Vi el ViewBag
en MVC 3. ¿Cómo es eso diferente que ViewData
en MVC 2?
Respuestas:
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.
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).
ViewData
y ViewBag
, no sobre ViewModel
.
dynamic
y apoya ViewBag.Message
. Uno usa la ViewData["Message"]
sintaxis anterior.
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"]
typecasting
pero no mostró cómo se realiza la conversión de texto
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 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>
<h4>@ViewBag.emp.Name</h4>
debería cambiar a<h4>@ViewBag.Employee.Name</h4>
Todas las respuestas sugieren que ViewBag
y / o ViewData
es pasar datos Controller
a los Views
que 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 ViewBag
y ViewData
?"
La diferencia más notable es que ViewData
es un diccionario fuertemente tipado, mientras que
ViewBag
es 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?
ViewBag
no 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
ViewData
tiene todas las propiedades de un diccionario como ContainsKey
, Add
etc., por lo que puede usarlo, ViewData.Add("somekey", "somevalue")
tenga en cuenta que puede generar excepciones.ViewData
en vistas necesita TypeCasting mientras ViewBag
que no.Conocer las diferencias sutiles, usar uno u otro es mucho más una preferencia de sabor.
Normalmente puedes pensar ViewBag.AnyKey
en un alias deViewData["AnyKey"]
¿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.
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 usando ViewBag en lugar de ViewData.
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 ...
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í.
ViewData en MVC
ViewBag en MVC
TempData en MVC
Sesión en MVC
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"
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 manera podemos hacer que use los valores para pasar la información entre el controlador a otra página con TEMP DATA
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 @item.productName</li>
}
</ul>
Pantalla de salida.
Ver datos
http://www.gurujipoint.com/2017/09/view-data-viewbag-and-tempdata.html
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.
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í: