Ho visto ViewBag
in MVC 3. In che modo è diverso rispetto ViewData
a MVC 2?
Ho visto ViewBag
in MVC 3. In che modo è diverso rispetto ViewData
a MVC 2?
Risposte:
Utilizza la funzione dinamica C # 4.0. Raggiunge lo stesso obiettivo di viewdata e dovrebbe essere evitato a favore dell'uso di modelli di vista fortemente tipizzati (allo stesso modo di evitare i viewdata).
Quindi sostanzialmente sostituisce le stringhe magiche :
ViewData["Foo"]
con proprietà magiche :
ViewBag.Foo
per il quale non hai la sicurezza del tempo di compilazione.
Continuo a incolpare Microsoft per aver mai introdotto questo concetto in MVC.
Il nome delle proprietà fa distinzione tra maiuscole e minuscole.
Le proprietà ViewBag interne sono memorizzate come coppie nome / valore nel dizionario ViewData .
Nota: nella maggior parte delle versioni pre-release di MVC 3, la proprietà ViewBag è stata denominata ViewModel come indicato in questo snippet dalle note di rilascio di MVC 3:
(modificato il 10-8-12) Mi è stato suggerito di pubblicare la fonte di queste informazioni che ho pubblicato, ecco la fonte: http://www.asp.net/whitepapers/mvc3-release-notes#_Toc2_4
I controller MVC 2 supportano una proprietà ViewData che consente di passare i dati a un modello di visualizzazione utilizzando un'API del dizionario con associazione tardiva. In MVC 3, puoi anche utilizzare una sintassi un po 'più semplice con la proprietà ViewBag per raggiungere lo stesso scopo. Ad esempio, invece di scrivere ViewData ["Message"] = "text", puoi scrivere ViewBag.Message = "text". Non è necessario definire alcuna classe fortemente tipizzata per utilizzare la proprietà ViewBag. Poiché si tratta di una proprietà dinamica, è possibile semplicemente ottenere o impostare proprietà e le risolverà in modo dinamico in fase di esecuzione. Internamente, le proprietà ViewBag sono memorizzate come coppie nome / valore nel dizionario ViewData. (Nota: nella maggior parte delle versioni pre-release di MVC 3, la proprietà ViewBag è stata denominata proprietà ViewModel.)
ViewData
e ViewBag
, non circa ViewModel
.
dynamic
e supporta ViewBag.Message
. Uno usa la vecchia ViewData["Message"]
sintassi.
ViewBag vs ViewData in MVC
http://royalarun.blogspot.in/2013/08/viewbag-viewdata-tempdata-and-view.html
Somiglianze tra ViewBag e ViewData:
Aiuta a mantenere i dati quando si passa dal controller alla visualizzazione. Utilizzato per passare i dati dal controller alla vista corrispondente. Vita breve significa che il valore diventa nullo quando si verifica il reindirizzamento. Questo perché il loro obiettivo è fornire un modo per comunicare tra controller e viste. È un meccanismo di comunicazione all'interno della chiamata del server.
Differenza tra ViewBag e ViewData:
ViewData è un dizionario di oggetti che deriva dalla classe ViewDataDictionary e accessibile usando le stringhe come chiavi. ViewBag è una proprietà dinamica che sfrutta le nuove funzionalità dinamiche in C # 4.0. ViewData richiede la tipografia per tipi di dati complessi e verifica la presenza di valori null per evitare errori. ViewBag non richiede il typecasting per tipi di dati complessi.
Esempio di ViewBag e ViewData:
public ActionResult Index()
{
ViewBag.Name = "Arun Prakash";
return View();
}
public ActionResult Index()
{
ViewData["Name"] = "Arun Prakash";
return View();
}
Chiamata in vista
@ViewBag.Name
@ViewData["Name"]
typecasting
ma non hai mostrato come viene eseguita la tipografia
ViewData
: Richiede la cast di tipi per tipi di dati complessi e verifica i valori null per evitare errori.
ViewBag
: Non richiede il cast di tipi per tipi di dati complessi.
Considera il seguente esempio:
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();
}
}
E il codice per View
è il seguente:
@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>
dovrebbe cambiare in<h4>@ViewBag.Employee.Name</h4>
Tutte le risposte suggeriscono che ViewBag
e / o ViewData
è quello di passare i dati da Controller
a Views
che è disinformazione. entrambi sono molto utili per passare i dati da Viste a Layout o Parziale a Viste (o ViewComponents, ecc.) Non è esclusivo del controller.
come esempio di asp.net predefinito lo hanno nella pagina di layout:
<title>@ViewData["Title"] - MyApp</title>
e in qualsiasi vista
ViewData["Title"] = "Details";
Quindi, per porre la domanda: "qual è la differenza tra ViewBag
e ViewData
?"
La differenza più notevole ViewData
è un dizionario fortemente tipizzato mentre
ViewBag
è un tipo dinamico.
Si noti che i dati all'interno sono gli stessi
ViewData["Title"] = "MyTitle";
ViewBag.Title; // returns "MyTitle";
Quando usare l'uno o l'altro?
ViewBag
non supporta nomi C # non validi. non è possibile accedere ViewData["Key With Space"]
conViewBag
ViewBag.Something
è dinamico e potresti avere problemi durante la chiamata di metodi (come i metodi di estensione) che devono conoscere il parametro esatto al momento della compilazione.ViewBag
può verificare la pulizia sintattica dei null: ViewBag.Person?.Name
ViewData
avere tutte le proprietà di un dizionario come ContainsKey
, Add
ecc. in modo da poter ViewData.Add("somekey", "somevalue")
tenere presente che potrebbe generare eccezioni.ViewData
nelle viste richiede TypeCasting, mentre ViewBag
non lo è.Conoscere le sottili differenze, usare l'uno o l'altro è molto più una preferenza di gusto.
Normalmente puoi pensare ViewBag.AnyKey
a un alias diViewData["AnyKey"]
Posso consigliarti di non usare neanche?
Se vuoi "inviare" dati al tuo schermo, invia un oggetto fortemente tipizzato (AKA ViewModel) perché è più facile testarlo.
Se ti leghi a una sorta di "Modello" e hai elementi "viewbag" o "viewdata" casuali, allora i test automatizzati saranno molto difficili.
Se stai usando questi, considera come potresti essere in grado di ristrutturare e usare semplicemente ViewModels.
Ci sono alcune sottili differenze che significano che puoi usare ViewData e ViewBag in modi leggermente diversi dalla vista. Un vantaggio è delineato in questo post http://weblogs.asp.net/hajan/archive/2010/12/11/viewbag-dynamic-in-asp-net-mvc-3-rc-2.aspx e mostra che il casting può essere evitato nell'esempio usando ViewBag anziché ViewData.
viewdata: è un dizionario utilizzato per archiviare i dati tra View e controller, è necessario eseguire il cast dell'oggetto view view nel modello corrispondente nella view per poter recuperare i dati da esso ...
ViewBag: è una proprietà dinamica simile nel suo funzionamento ai dati della vista, tuttavia è meglio perché non ha bisogno di essere trasmesso al suo modello di risposta prima di usarlo nella vista ...
Di seguito è la differenza punto a punto su ViewData, ViewBag, TempData & Session. Credito / copiato askforprogram.in , Segui il link per l'esempio di codice che non ho menzionato qui.
ViewData in MVC
ViewBag in MVC
TempData in MVC
Sessione in MVC
Sebbene non si possa avere un vantaggio tecnico nella scelta di un formato rispetto all'altro, è necessario essere consapevoli di alcune importanti differenze tra le due sintassi. Una differenza evidente è che ViewBag funziona solo quando la chiave a cui si accede è un identificatore C # valido. Ad esempio, se si inserisce un valore in ViewData ["Chiave con spazi"], non è possibile accedere a tale valore utilizzando ViewBag perché il codice non verrà compilato. Un altro problema chiave da considerare è che non è possibile passare valori dinamici come parametri ai metodi di estensione. Il compilatore C # deve conoscere il tipo reale di ogni parametro al momento della compilazione per scegliere il metodo di estensione corretto. Se un parametro è dinamico, la compilazione fallirà. Ad esempio, questo codice fallirà sempre: @ Html.TextBox ("nome", ViewBag.Name). Per aggirare questo problema, utilizzare ViewData ["Nome"
public ActionResult Index()
{
ViewBag.Name = "Monjurul Habib";
return View();
}
public ActionResult Index()
{
ViewData["Name"] = "Monjurul Habib";
return View();
}
In View:
@ViewBag.Name
@ViewData["Name"]
In questo modo possiamo far sì che utilizzi i valori per passare le informazioni tra il controller ad altre pagine con TEMP DATA
Una delle principali differenze che ho notato tra ViewData e ViewBag è:
ViewData: restituirà l'oggetto non importa cosa ti è stato assegnato e dovrai ricominciare a digitare nuovamente al tipo originale.
ViewBag: è abbastanza intelligente restituire il tipo esatto che cosa gli è stato assegnato, indipendentemente dal tempo che hai assegnato al tipo semplice (ad esempio int, stringa ecc.) O al tipo complesso.
Es: codice controller.
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; }
}
}
Visualizza codice.
<ul>
@foreach (WebApplication1.Controllers.Products item in ViewBag.Countries)
{
<li>@item.productId @item.productName</li>
}
</ul>
Schermata di uscita.
Visualizza dati
http://www.gurujipoint.com/2017/09/view-data-viewbag-and-tempdata.html
Qui Viewdata e ViewBag entrambi sono dati passaggio utilizzati dai controller a vista .
1. ViewData
- ViewData è l'oggetto dizionario derivato dalla classe ViewDataDictonary .
- I dati consentono solo una richiesta, i valori ViewData vengono cancellati quando si verifica il reindirizzamento della pagina.
- Il valore ViewData deve essere digitato cate prima dell'uso.
Esempio: nel controller
public ActionResult PassingDatatoViewWithViewData()
{
ViewData["Message"] = "This message shown in view with the ViewData";
return View();
}
In vista
@ViewData["Message"];
- Con ViewData è una coppia come Chiave e Valore , Messaggio è Chiave e in virgola invertita è Valore.
- I dati sono semplici, quindi non è possibile utilizzare la tipografia qui se i dati sono complessi, quindi utilizzare il cast di tipo.
public ActionResult PassingDatatoViewWithViewData()
{
var type= new List<string>
{
"MVC",
"MVP",
"MVVC"
};
ViewData["types"] = type;
return View();
}
- In Visualizza i dati possono essere estratti come
<ul>
@foreach (var items in (List<string>)ViewData["types"])
{
<li>@items</li>
}
</ul>
2. ViewBag
--ViewBag utilizza la funzione dinamica. Wrapper ViewBag attorno a ViewData.
- In ViewBag è richiesto il casting.
- Come ViewData, se si verifica il reindirizzamento il valore diventa null.
Esempio:
public ActionResult PassingDatatoViewWithViewBag()
{
ViewData.Message = "This message shown in view with the ViewBag";
return View();
}
In vista
@ViewBag.vbMessage
--Per il tipo complesso utilizzare ViewBag
public ActionResult PassingDatatoViewWithViewBag()
{
var type= new List<string>
{
"MVC",
"MVP",
"MVVC"
};
ViewBag.types = type;
return View();
}
- In Visualizza i dati possono essere estratti come
<ul>
@foreach (var items in ViewBag.types)
{
<li>@items</li>
}
</ul>
- la differenza principale è che ViewBag non ha richiesto il typecasting ma ViewData è richiesto il typecasting.
ViewBag e ViewData sono due mezzi che vengono utilizzati per passare le informazioni dal controller per visualizzarle in ASP.Net MVC. L'obiettivo di utilizzare entrambi i meccanismi è quello di fornire la comunicazione tra controller e View. Entrambi hanno una durata breve che è il valore di entrambi diventa nullo una volta che si è verificato il reindirizzamento ovvero, una volta che la pagina è reindirizzata dalla pagina di origine (dove impostiamo il valore di ViewBag o ViewData) sulla pagina di destinazione, sia ViewBag che ViewData diventa nullo.
Pur avendo queste somiglianze, entrambi (ViewBag e ViewData) sono due cose diverse se parliamo dell'implementazione di entrambi. Le differenze sono le seguenti:
1.) Se analizziamo sia l'implementazione saggia, scopriremo che ViewData è una struttura di dati del dizionario - Dizionario di oggetti derivati da ViewDataDictionary e accessibile usando stringhe come Chiavi per questi valori mentre ViewBag fa uso delle funzionalità dinamiche introdotte in C # 4.0 e è una proprietà dinamica.
2.) Mentre accediamo ai valori da ViewData, dobbiamo digitare i valori (tipi di dati) in modo che siano memorizzati come Oggetti nel dizionario ViewData ma non è necessario se accediamo al valore in caso di ViewBag.
3.) In ViewBag possiamo impostare il valore in questo modo:
ViewBag.Name = "Value";
e può accedere come segue:
@ViewBag.Name
Mentre nel caso di ViewData è possibile impostare e accedere ai valori come segue: Impostare ViewData come segue:
ViewData["Name"] = "Value";
e accedere a un valore come questo
@ViewData["Name"]
Per maggiori dettagli clicca qui: