Domanda

ho visto il ViewBag in MVC 3. Come è così diverso da quello ViewData in MVC 2?

È stato utile?

Soluzione

Si utilizza la funzione dinamica C # 4.0. Si raggiunge lo stesso obiettivo come viewdata e deve essere evitato in favore dell'uso di modelli di vista fortemente tipizzati (allo stesso modo di viewdata dovrebbe essere evitato).

Quindi, in pratica si sostituisce corde magiche :

ViewData["Foo"]

con proprietà magiche :

ViewBag.Foo

per i quali non si ha la sicurezza di compilazione.

Io continuo a biasimare Microsoft per sempre l'introduzione di questo concetto in MVC.

Il nome delle proprietà sono case sensitive.

Altri suggerimenti

Internamente ViewBag le proprietà sono memorizzate come coppie nome / valore nel Viewdata dizionario .

Nota: nella maggior parte delle versioni pre-release di MVC 3, la proprietà ViewBag è stato nominato il ViewModel come indicato in questo frammento da MVC 3 note di rilascio:

(a cura 10-8-12) E 'stato suggerito vi posto la fonte di queste informazioni che ho postato, qui è la fonte: http://www.asp.net/whitepapers/mvc3-release-notes#_Toc2_4

MVC 2 controller supportano un Viewdata proprietà che consente di trasmettere i dati ad un modello di vista utilizzando un tardo-bound API dizionario. In MVC 3, è anche possibile utilizzare la sintassi po 'più semplice con la immobili ViewBag per realizzare il stesso scopo. Ad esempio, invece di scrittura Viewdata [ "Messaggio"] = "text", è possibile scrivere ViewBag.Message = "text". Non è necessario definire qualsiasi classi per utilizzare il fortemente tipizzato immobili ViewBag. Perché è un proprietà dinamica, è possibile invece solo ottenere o in set e sarà risolverli in modo dinamico in fase di esecuzione. Internamente, le proprietà sono ViewBag memorizzati come coppie nome / valore nel dizionario Viewdata. (Nota: nella maggior parte dei pre-release di versioni MVC 3, il Proprietà ViewBag è stato nominato il ViewModel proprietà.)

ViewBag vs Viewdata in MVC

http://royalarun.blogspot.in/ 2013/08 / viewbag-viewdata-TempData-e-view.html

Analogie tra ViewBag & Viewdata:

Aiuta a mantenere i dati quando si sposta da controller a vista. Abituato a trasmettere dati dal controllore di vista corrispondente. mezzi breve vita valore diventa nullo quando si verifica il reindirizzamento. Questo perché il loro obiettivo è quello di fornire un modo per comunicare tra controllori e viste. Suo un meccanismo di comunicazione all'interno della chiamata del server.

Differenza tra ViewBag & Viewdata:

Viewdata è un dizionario di oggetti che è derivata da Classe ViewDataDictionary e accessibili utilizzando le stringhe come chiavi. ViewBag è una struttura dinamica che sfrutta le nuove caratteristiche dinamiche in C # 4.0. Viewdata richiede typecasting per il tipo di dati complessi e verificare la presenza di valori nulli di errore evitare. ViewBag non richiede typecasting per il tipo di dati complessi.

ViewBag & Viewdata Esempio:

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

ViewData :. Richiede tipo casting per i tipi di dati complessi e verifica la presenza di valori nulli a errori Evita

ViewBag :. Non richiede tipo di casting per i tipi di dati complessi

Si consideri 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 è la 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>

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 Vista a Layout o parziale di Vista (o ViewComponents, ecc) Non controller di esclusiva.

come il campione asp.net di default ha questo nel layout di pagina:

<title>@ViewData["Title"] - MyApp</title>

e in qualsiasi vista

ViewData["Title"] = "Details";

E allora, per porre la domanda: "Qual è la differenza tra ViewBag e ViewData"

La differenza più evidente è ViewData è un fortemente tipizzato dizionario mentre ViewBag è un tipo dinamico.

Si noti che la parte interna dei dati È LO STESSO

ViewData["Title"] = "MyTitle";
ViewBag.Title; // returns "MyTitle";

Quando utilizzare uno o l'altro?

  • ViewBag non supporta non nomi validi C #. non è possibile l'accesso ViewData["Key With Space"] con ViewBag
  • ViewBag.Something è dinamica e si possono avere problemi quando si chiama metodi (come metodi di estensione), che ha bisogno di sapere il parametro esatto al momento della compilazione.
  • ViewBag può verificare la presenza di valori nulli pulita sintattico: ViewBag.Person?.Name
  • ViewData avere tutte le proprietà di un dizionario come ContainsKey, Add, ecc in modo da poter utilizzare tenere ViewData.Add("somekey", "somevalue") in mente che potrebbe generare eccezioni.
  • Uso ViewData sulla vista ha bisogno di fusione di caratteri, mentre ViewBag non lo fanno.

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

In genere si può pensare di ViewBag.AnyKey ad un alias di ViewData["AnyKey"]

Posso consiglia di non utilizzare a uno?

Se si desidera i dati "Invia" per il vostro schermo, inviare un oggetto fortemente tipizzato (pseudonimo ViewModel) perché è più facile da testare.

Se si legano a una sorta di "modello" e hanno casuali o elementi "viewbag" "Viewdata" allora ha automatizzato test molto difficile.

Se si sta utilizzando questi considerano come si potrebbe essere in grado di ristrutturare e basta usare ViewModel.

Ci sono alcune sottili differenze che significa che si può usare Viewdata e ViewBag in modi leggermente diversi dalla vista. Un vantaggio è delineata in questo post http://weblogs.asp.net/hajan/archive/2010/12/11/viewbag-dynamic-in-asp-net-mvc-3-rc-2.aspx e mostra come colata può essere evitato nell'esempio utilizzando il ViewBag anziché Viewdata.

viewdata: è un dizionario utilizzato per memorizzare i dati tra la vista e il controller, u bisogno di lanciare l'oggetto di dati al fine di suo modello corrispondente nella vista per essere in grado di recuperare i dati da esso ...

ViewBag: è una struttura dinamica simile nel suo lavoro per i dati di vista, tuttavia è meglio perchè non ha bisogno di essere fusa al suo modello corressponding prima di utilizzarlo nella vista .. .

Di seguito è riportato il punto per punto di differenza su Viewdata, ViewBag, TempData & Session. credito / copiati askforprogram.in , Segui il link per esempio di codice che non ho menzionato qui.

  1. Viewdata in MVC

    • Viewdata è di proprietà di classe ControllerBase.
    • Viewdata è un tipo di oggetto Dictionary.
    • Viewdata è il valore-chiave raccolta dizionario.
    • Viewdata è stato introdotto in MVC versione 1.0.
    • Viewdata funziona con .NET Framework 3.5 e superiori.
    • devi fare tipo di conversione di codice durante l'enumerazione.
    • oggetto Viewdata mantiene i dati solo per la richiesta di corrente.
  2. ViewBag in MVC

    • ViewBag è di proprietà di classe ControllerBase.
    • ViewBag è un tipo di oggetto dinamico.
    • ViewBag è un tipo di oggetto.
    • ViewBag è stata introdotta nella versione 3.0 MVC.
    • ViewBag funziona con .NET Framework 4.0 e superiori.
    • ViewBag utilizza la proprietà e gestisce, in modo non c'è bisogno di fare la conversione del tipo, mentre enumerazione.
    • oggetto ViewBag mantiene i dati solo per la richiesta di corrente.
  3. TempData in MVC

    • TempData è di proprietà di classe ControllerBase.
    • TempData è un tipo di oggetto Dictionary.
    • TempData è il valore-chiave raccolta dizionario.
    • TempData è stato introdotto in MVC versione 1.0.
    • TempData funziona con .NET Framework 3.5 e superiori.
    • devi fare tipo di conversione di codice durante l'enumerazione.
    • oggetto
    • TempData è usato per dati tra richiesta corrente e successiva richiesta.
  4. Sessione in MVC

    • Session è di proprietà del Controller (classe astratta).
    • Session è un tipo di HttpSessionStateBase.
    • Session è il valore-chiave raccolta dizionario.
    • La sessione è stata introdotta in MVC versione 1.0.
    • TempData funziona con .NET Framework 1.0 e superiori.
    • devi fare tipo di conversione di codice durante l'enumerazione.
    • oggetto
    • Session mantiene i dati per tutte le richieste. Valido per tutte le richieste, non scade mai.

Anche se non si potrebbe avere un vantaggio tecnico per la scelta di un formato più di l'altro, si dovrebbe essere a conoscenza di alcune importanti differenze tra i due sintassi. Una differenza evidente è che ViewBag funziona solo quando la chiave si sta accedendo è una valida C # identificazione er. 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 aspetto fondamentale da considerare è che non è possibile passare in valori dinamici come parametri a metodi di estensione. Il compilatore C # deve conoscere il tipo reale di ogni parametro al momento della compilazione al fine di scegliere il metodo di estensione corretta. Se qualsiasi parametro è dinamico, la compilazione fallirà. Ad esempio, questo codice sempre esito negativo: @ Html.TextBox ( "nome", ViewBag.Name). Per ovviare a questo, sia uso Viewdata [ "Nome"] o scagli la va

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 si può rendere utilizzare i valori al passare le informazioni tra il controller di altra pagina con TEMP DATA

Una differenza principale che ho notato tra il Viewdata e ViewBag è:

Viewdata:. Tornerà oggetto non importa ciò che è stato assegnato in questo e necessità di typecast nuovo indietro al tipo originale

ViewBag: è abbastanza intelligente per tornare esatto digitare ciò che avete assegnato ad esso non importa del tempo Tu aver assegnato tipo semplice (cioè int, string, ecc) o di tipo complesso

.

Esempio:. Controller cod

 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>

output su schermo.

entrare descrizione dell'immagine qui

Visualizza dati

  1. Viewdata viene utilizzato per passare dati dal controllore di visualizzazione
  2. Viewdata è derivata dalla classe ViewDataDictionary ed è fondamentalmente un dizionario degli oggetti i.e.Keys e valori in cui le chiavi sono String mentre valori saranno gli oggetti.
  3. typcasting
  4. I dati sono necessari durante il recupero dei dati da Viewdata a causa del suo tipo di oggetto di dati e anche nullo controllo vValue befor tipo colata altrimenti si romperà l'applicazione. Se si verifica il reindirizzamento, quindi il suo valore diventa nullo Leggi l'articolo completo differenza tra TempData Viewdata e Visualizza carrello

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

Viewdata
  1. Viewdata viene utilizzato per passare dati dal controllore a vista
  2. È derivato dalla classe ViewDataDictionary
  3. E 'disponibile per la richiesta corrente solo
  4. Richiede typecasting per il tipo di dati complessi e controlli per valori nulli di errore evitare
  5. Se si verifica il reindirizzamento, quindi il suo valore diventa nullo
ViewBag
  1. ViewBag viene inoltre utilizzato per passare dati dal controllore al rispettivo vista
  2. ViewBag è una proprietà dinamica che sfrutta la nuova dinamica dispone in C # 4.0
  3. E 'disponibile anche per la richiesta corrente solo
  4. Se si verifica il reindirizzamento, quindi il suo valore diventa nullo
  5. non richiede typecasting per il tipo di dati complessi

Qui Viewdata e ViewBag entrambi sono dati passa usati da controller a Visualizza .

1. Viewdata

-. Viewdata è oggetto dizionario che è derivata da ViewDataDictonary class

-. I dati consentono solo per una richiesta, valori viewdata vengono cancellati quando si verifica pagina di reindirizzamento

-. Viewdata valore deve essere digitato cato prima dell'uso

Esempio: controller

public ActionResult PassingDatatoViewWithViewData()
{
      ViewData["Message"] = "This message shown in view with the ViewData";
      return View();
}

Visualizza

@ViewData["Message"];

-. Con Viewdata è una coppia come chiave e Valore , il messaggio è fondamentale e di valore virgoletta è Valore

-. I dati è semplice, quindi non possiamo usare typecasting qui se i dati è complessa quindi utilizzando il casting di tipo

public ActionResult PassingDatatoViewWithViewData()
{
      var type= new List<string>
    {
        "MVC",
        "MVP",
        "MVVC"
    };
    ViewData["types"] = type;
    return View();
}

- In considerazione dei dati può essere estratto come

<ul>
        @foreach (var items in (List<string>)ViewData["types"])
        {
         <li>@items</li>
        }
  </ul>

2. ViewBag

-. ViewBag utilizza l'involucro dinamico feature.ViewBag intorno al Viewdata

-. È necessario Tipo In ViewBag fusione

-. Uguale a Viewdata, se si verifica il reindirizzamento valore diventa nullo

Esempio:

public ActionResult PassingDatatoViewWithViewBag()
{
          ViewData.Message = "This message shown in view with the ViewBag";
          return View();
}

Visualizza

@ViewBag.vbMessage

- Per l'uso Complex Tipo ViewBag

public ActionResult PassingDatatoViewWithViewBag()
{
          var type= new List<string>
        {
            "MVC",
            "MVP",
            "MVVC"
        };
        ViewBag.types = type;
        return View();
 }

- In considerazione dei dati può essere estratto come

<ul>
       @foreach (var items in ViewBag.types)
       {
         <li>@items</li>
       }
</ul>

-. La differenza principale è che ViewBag fusione di caratteri non richiesto, ma Viewdata fusione di caratteri è necessario

ViewBag e Viewdata sono due mezzi che vengono utilizzati per passare informazioni dal dispositivo di controllo per visualizzare in ASP.Net MVC. L'obiettivo di utilizzare sia il meccanismo è quello di fornire il communicaton tra il controller e View. Entrambi hanno breve vita che è il valore di entrambi diventa nullo quando il reindirizzamento è verificato cioè, una volta che la pagina è reindirizzato dalla pagina di origine (dove si imposta il valore di ViewBag o Viewdata) alla pagina di destinazione, sia ViewBag nonché Viewdata diventa nullo.

Nonostante queste somiglianze, sia (e ViewBag viewdata) sono due cose diverse, se si parla della realizzazione di entrambi. Le differenze sono i seguenti:

1) Se si analizza sia l'attuazione saggio allora troveremo che Viewdata è una struttura dati dizionario -. Dizionario di oggetti derivati ??da ViewDataDictionary ed usando accessibili stringhe come chiavi per questi valori, mentre ViewBag fa uso della dinamica funzionalità introdotte in C # 4.0 e è una struttura dinamica.

2.) Durante l'accesso ai valori formare Viewdata, abbiamo bisogno di typecast i valori (tipi di dati) in cui sono memorizzati come oggetti nel dizionario Viewdata ma non v'è tale necessità, se stiamo accedendo esimo valore nel caso di ViewBag.

3) In ViewBag possiamo impostare il valore in questo modo:.

      ViewBag.Name = "Value"; 

e l'accesso lattina come segue:

          @ViewBag.Name

Mentre nel caso di Viewdata i valori possono essere impostati e accessibili come segue: Impostazione Viewdata come segue:

ViewData["Name"] = "Value";

e il valore accedendo come questo

 @ViewData["Name"] 

Per maggiori dettagli clicca qui:

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top