Pagine

martedì 24 luglio 2012

ViewBag e ViewData–Questi sconosciuti

 

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.