Qual è la differenza tra ViewData e ViewBag?


Risposte:


388

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.


11
Per quale motivo stai accusando microsoft? Se nessun viewdata come potremmo associare l'elenco a discesa dal modello. (Non credo che usare la lista di selezione all'interno del modello sarebbe una buona idea)
Sottotitolo Jacob,

15
@SubinJacob Dovresti davvero fare una nuova domanda se vuoi una risposta a questo. La creazione di un SelectList è sicuramente la strada da percorrere per creare un elenco a discesa.
MiniRagnarok,

25
Penso che sia un po 'soggettivo. I modelli fortemente tipizzati sono belli e yada yada, ma per gli scenari in cui stai rapidamente ottenendo una vista attiva e funzionante, ViewBag e simili svolgono il lavoro più velocemente di Controller, View, Model, AutoMapper to ViewModel, ecc.
Craig Brett

11
@Darin, perché "incolpi" Microsoft per averlo introdotto? È solo uno strumento offerto agli sviluppatori. Se sai cosa stai facendo, puoi trarne il massimo. Se non ti piace o ti senti più incline agli errori, semplicemente non usarlo. :)
Bilal Fazlani,

5
Come suggerisci di passare i dati tra parziali e layout? Le persone danno la colpa quando non vedono il quadro completo. Immagino che tu abbia controller di base e modelli di visualizzazione di base o oggetti statici / singoli ovunque. Indovina un po ', meglio imparare a usare i dati di visualizzazione e incolpare te stesso per aver usato lo strumento sbagliato per il lavoro.
Bart Calixto,

42

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


La domanda pone la differenza tra ViewDatae ViewBag, non circa ViewModel.
Matthew Flaschen,

Grazie per l'heads-up Matthew Flaschen, ho avuto un refuso nella risposta e l'ho risolto, ora legge "ViewData" invece di ViewModel che è stato un errore. :)
Rich Bianco

Adesso non è corretto Nessuno dei due è stato rinominato nell'altro. Entrambi esistono ancora. Uno è dynamice supporta ViewBag.Message. Uno usa la vecchia ViewData["Message"]sintassi.
Matthew Flaschen,

1
+1 Ma da quale fonte stai citando ...? Dovrebbe davvero fornire un link.
Sam,

1
Grazie Sam per il suggerimento. Ho aggiunto un link alla fonte originale.
Rich Bianco

34

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

7
la tua risposta indica typecastingma non hai mostrato come viene eseguita la tipografia
Alex

31

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>

6
aiutami a capire ma penso che ci sia un errore. questo <h4>@ViewBag.emp.Name</h4> dovrebbe cambiare in<h4>@ViewBag.Employee.Name</h4>
Benny Margalit il

24

Tutte le risposte suggeriscono che ViewBage / o ViewDataè quello di passare i dati da Controllera Viewsche è 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 ViewBage 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?

  • ViewBagnon 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
  • ViewDataavere tutte le proprietà di un dizionario come ContainsKey, Addecc. in modo da poter ViewData.Add("somekey", "somevalue")tenere presente che potrebbe generare eccezioni.
  • L'utilizzo ViewDatanelle viste richiede TypeCasting, mentre ViewBagnon lo è.

Conoscere le sottili differenze, usare l'uno o l'altro è molto più una preferenza di gusto.

Normalmente puoi pensare ViewBag.AnyKeya un alias diViewData["AnyKey"]


14

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.


4
Ignorando il principio "compilatore è il primo test unitario" in che modo un modello di visualizzazione tipicamente statico rende il codice più testabile di un tipo dinamico? Mentre il requisito per i test è più importante in una soluzione tipizzata in modo dinamico, se entrambe le soluzioni implementano lo stesso numero e tipo di test non si perde nulla.
Darren Lewis,

Sono d'accordo, è un po 'vago. Forse è coinvolto l'intellisense.
Joshua Ramirez,

1
Un esempio sarebbe beffardo. Se si desidera testare un'unità di un'azione del controller, è più semplice creare un oggetto "finto" da passare e asserire piuttosto che provare ad affermare che una stringa è stata aggiunta a un dizionario o che un campo dinamico è impostato su un valore - è un concetto simile ai contratti di servizio con un oggetto "Richiesta" e un oggetto "Risposta", anziché prendere più parametri.
nootn,

come passeresti i dati da Visualizza a Layout se non li utilizzassi? -1
Bart Calixto,

Come è una risposta?
JSON,


6

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


4

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.

  1. ViewData in MVC

    • ViewData è di proprietà della classe ControllerBase.
    • ViewData è un tipo di oggetto dizionario.
    • ViewData è una raccolta di dizionari di valori-chiave.
    • ViewData è stato introdotto nella versione MVC 1.0.
    • ViewData funziona con .Net framework 3.5 e versioni successive.
    • È necessario eseguire la conversione del codice durante l'enumerazione.
    • L'oggetto ViewData conserva i dati solo per la richiesta corrente.
  2. ViewBag in MVC

    • ViewBag è di proprietà della classe ControllerBase.
    • ViewBag è un tipo di oggetto dinamico.
    • ViewBag è un tipo di oggetto.
    • ViewBag è stato introdotto nella versione MVC 3.0.
    • ViewBag funziona con .Net framework 4.0 e versioni successive.
    • ViewBag utilizza la proprietà e la gestisce, quindi non è necessario eseguire la conversione del tipo durante l'enumerazione.
    • L'oggetto ViewBag conserva i dati solo per la richiesta corrente.
  3. TempData in MVC

    • TempData è di proprietà della classe ControllerBase.
    • TempData è un tipo di oggetto dizionario.
    • TempData è una raccolta di dizionari di valori-chiave.
    • TempData è stato introdotto nella versione MVC 1.0.
    • TempData funziona con .Net framework 3.5 e versioni successive.
    • È necessario eseguire la conversione del codice durante l'enumerazione.
    • L'oggetto TempData viene utilizzato per i dati tra la richiesta corrente e la richiesta successiva.
  4. Sessione in MVC

    • La sessione è di proprietà del controller (classe astratta).
    • Session è un tipo di HttpSessionStateBase.
    • La sessione è una raccolta di dizionari di valori-chiave.
    • La sessione è stata introdotta nella versione MVC 1.0.
    • TempData funziona con .Net framework 1.0 e versioni successive.
    • È necessario eseguire la conversione del codice durante l'enumerazione.
    • L'oggetto sessione conserva i dati per tutte le richieste. Valido per tutte le richieste, non scade mai.

1

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"


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

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

In View:

@ViewBag.Name 
@ViewData["Name"] 

0

In questo modo possiamo far sì che utilizzi i valori per passare le informazioni tra il controller ad altre pagine con TEMP DATA


0

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 &nbsp;&nbsp;&nbsp;@item.productName</li>
            }
        </ul>

Schermata di uscita.

inserisci qui la descrizione dell'immagine


0

Visualizza dati

  1. ViewData viene utilizzato per passare i dati dal controller alla visualizzazione
  2. ViewData deriva dalla classe ViewDataDictionary ed è fondamentalmente un oggetto Dizionario ieKeys e Values ​​in cui le chiavi sono String mentre i valori saranno oggetti.
  3. Durante il recupero dei dati da ViewData è richiesto il typcasting dei dati a causa del tipo di dati Object e del controllo del valore null prima del cast del tipo, altrimenti si romperà l'applicazione. Se si verifica il reindirizzamento, il suo valore diventa null Leggi la differenza completa tra TempData ViewData e View Bag

http://www.gurujipoint.com/2017/09/view-data-viewbag-and-tempdata.html


0
Viewdata
  1. ViewData viene utilizzato per passare i dati dal controller alla visualizzazione
  2. Deriva dalla classe ViewDataDictionary
  3. È disponibile solo per la richiesta corrente
  4. Richiede la tipografia per tipi di dati complessi e controlla i valori null per evitare errori
  5. Se si verifica il reindirizzamento, il suo valore diventa null
ViewBag
  1. ViewBag viene anche utilizzato per passare i dati dal controller alla rispettiva vista
  2. ViewBag è una proprietà dinamica che sfrutta le nuove funzionalità dinamiche in C # 4.0
  3. È disponibile anche solo per la richiesta corrente
  4. Se si verifica il reindirizzamento, il suo valore diventa null
  5. Non richiede il typecasting per tipi di dati complessi

0

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.


-1

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:


2
scusate ho effettuato il downgrade ma questa risposta richiede diversi paragrafi per non dire nulla di utile. La cosa utile mancante dalla risposta accettata sarebbe la frase "viewbag è un wrapper dinamico attorno a viewdata" che ho imparato da rachelappel.com/…
Chris F Carroll
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.