In Asp.Net MVC solitamente nell’ActionResult si ritorna la risposta del controller, quindi i valori richiesti dalla view, mentre si utilizza ViewBag e ViewData per passare ulteriori informazioni, come ad esempio parametri e altre informazioni accessorie.
Ma, credo, almeno una volta vi sarà passato di mente: ma che differenza c’è tra ViewBag e ViewData? Quando utilizzare il primo e quando il secondo?
Senza che vi leggiate tutto l’articolo vi dico fin da subito che non c’è alcuna differenza tra i due, infatti uno è l’estensione dell’altro.
public dynamic ViewBag
{
get
{
if (_dynamicViewData == null)
{
_dynamicViewData =
new DynamicViewDataDictionary(() => ViewData);
}
return _dynamicViewData;
}
}
Quando accediamo ad un membro dinamico di DynamicViewDataDictionary accediamo al metodo TryGetMember :
public override bool TryGetMember(
GetMemberBinder binder, out object result)
{
result = ViewData[binder.Name];
return true;
}
Come potete vedere quindi i due sono uno complementare dell’altro.
Utilizzare ViewData
Come si utilizza ViewData? Semplice nel controller:
public ActionResult Index()
{
var sviluppatori = new List<string>
{
"Alberto",
"Stefano",
"Gilberto"
};
ViewData["sviluppatori"] = sviluppatori;
return View();
}
Come vedete in questo caso passiamo alla view una lista di stringhe, quindi nella view scriveremo :
<ul>
@foreach (var sviluppatore in (List<string>)ViewData["sviluppatori"])
{
<li>
@sviluppatore
</li>
}
</ul>
Nell’utilizzare ViewData l’unico neo sta che per accedere ai dati si devono utilizzare le stringhe
Utilizzare ViewBag
Per utilizzare ViewBag invece, riutilizzando l’esempio sopra:
public ActionResult Index()
{
var sviluppatori = new List<string>
{
"Alberto",
"Stefano",
"Gilberto"
};
ViewBag.sviluppatori = sviluppatori;
return View();
}
E quindi la View di conseguenza diventa :
<ul>
@foreach (var sviluppatore in ViewBag.sviluppatori)
{
<li>
@sviluppatore
</li>
}
</ul>
Da notare che nella View manca il casting, infatti non è necessario, in quanto l’oggetto dinamico è tipizzato.
Che succede però se nella View sbaglio e invece di mettere ViewBag.sviluppatori metto ViewBag.svil? Nell’esempio sopra proposto va in errore in quanto ViewBag.svil è null.
Conclusioni
Visto che ViewBag deriva da ViewData si può mescolare il Controller con la View, quindi ad esempio nel Controller usare ViewData e nella View usare ViewBag. Ovviamente ve lo sconsiglio.
Concludendo, quale dei due usare? Beh, a dire il vero è solo una questione di gusti personali, io preferisco ViewBag.