2013-03-04 4 views
10

ViewData e ViewBag consentono di accedere a tutti i dati in vista passati dal controller.ViewBag, ViewData, TempData, Session: come e quando utilizzarli?

La differenza principale tra questi due è il modo in cui si accede ai dati. In ViewBag si accede ai dati usando stringhe come chiavi - ViewBag ["numbers"] In ViewData si accede ai dati usando le proprietà - ViewData.numbers.

Viewdata esempio

CONTROLLER

var Numbers = new List<int> { 1, 2, 3 }; 

      ViewData["numbers"] = Numbers; 

VISTA

<ul> 
@foreach (var number in (List<int>)ViewData["numbers"]) 
{ 
    <li>@number</li> 
} 

</ul> 

ViewBag esempio

CONTROLLER

var Numbers = new List<int> { 1, 2, 3 }; 

     ViewBag.numbers = Numbers; 

VISTA

<ul> 

@foreach (var number in ViewBag.numbers) 

{ 
<li>@number</li> 
} 

</ul> 

sessione è un altro oggetto molto utile che conterrà tutte le informazioni.

Ad esempio, quando l'utente ha effettuato l'accesso al sistema, desidera mantenere il proprio livello di autorizzazione.

// GetUserAuthorizationLevel - some method that returns int value for user authorization level. 

Session["AuthorizationLevel"] = GetUserAuthorizationLevel(userID); 

Queste informazioni verranno memorizzate in sessione fino a quando la sessione utente è attiva. questo può essere cambiato nel file web.config:

<system.web> 
    <sessionState mode="InProc" timeout="30"/> 

Allora controller dentro l'azione:

public ActionResult LevelAccess() 
    { 
     if (Session["AuthorizationLevel"].Equals(1)) 
     { 
      return View("Level1"); 
     } 

     if (Session["AuthorizationLevel"].Equals(2)) 
     { 
      return View("Level2"); 
     } 

     return View("AccessDenied"); 
    } 

TempData è molto simile a Viewdata e ViewBag tuttavia conterrà dati solo per una richiesta.

CONTROLLER

// È stato creato un metodo per aggiungere nuovo cliente.

TempData["ClientAdded"] = "Client has been added"; 

VISTA

@if (TempData["ClientAdded"] != null) 
{ 
    <h3>@TempData["ClientAdded"] </h3> 
} 

TempData è utile quando si desidera passare alcune informazioni da Vista al controller. Ad esempio, si desidera conservare il tempo in cui è stata richiesta la vista.

VISTA

@{ 
TempData["DateOfViewWasAccessed"] = DateTime.Now; 
} 

CONTROLLER

if (TempData["DateOfViewWasAccessed"] != null) 
    { 
    DateTime time = DateTime.Parse(TempData["DateOfViewWasAccessed"].ToString()); 
    } 
+0

Grazie per ulteriori informazioni su questo! Questo dovrebbe essere molto utile per la maggior parte delle persone. –

+0

C'è una domanda qui o si tratta di un post sul blog? Va bene rispondere alla tua domanda, ma dovrebbe essere fatta come risposta, non come parte della domanda. Ancora più importante, questo materiale è già stato trattato in precedenza, ad esempio [Qual è il momento giusto per ViewData, ViewBag, Session, TempData] (http://stackoverflow.com/questions/12676924/what-is-the-right-time -for-viewdata-viewbag-session-tempdata) –

+0

Lo ricorderò per il futuro e mi dispiace per quello. Ho provato a dare altri esempi e forse alcuni sviluppatori più esperti condividono anche la loro esperienza. –

risposta

11

ViewBag, Viewdata, TempData, Sessione - come e quando usarli?

ViewBag

evitarlo. Usa un modello di vista quando puoi.

Il motivo è che quando si utilizzano le proprietà dinamiche non si otterranno errori di compilazione. È davvero facile cambiare il nome di una proprietà per sbaglio o per scopo e poi dimenticare di aggiornare tutti gli usi.

Se si utilizza un ViewModel non si avrà questo problema. Un modello di vista sposta anche la responsabilità di adattare la "M" (cioè le entità di business) in MVC dal controller e la vista a ViewModel, ottenendo così un codice più pulito con responsabilità chiare.

azione

public ActionResult Index() 
{ 
    ViewBag.SomeProperty = "Hello"; 
    return View(); 
} 

View (sintassi rasoio)

@ViewBag.SomeProperty 

Viewdata

Avoit esso.Usa un modello di vista quando puoi. La stessa ragione per ViewBag.

azione

public ActionResult Index() 
{ 
    ViewData["SomeProperty"] = "Hello"; 
    return View(); 
} 

View (sintassi rasoio):

@ViewData["SomeProperty"] 

dati Temp

tutto ciò che si memorizzano in TempData rimarrà in TempData fino a leggere esso, non importa se ci sono una o più richieste HTTP in mezzo.

azioni

public ActionResult Index() 
{ 
    TempData["SomeName"] = "Hello"; 
    return RedirectToAction("Details"); 
} 


public ActionResult Details() 
{ 
    var someName = TempData["SomeName"]; 
} 
+1

"Quando è necessario mantenere le informazioni su più richieste" - Penso che TempData sia valido solo finché non viene letto. Penso che l'uso di diverse richieste qui sia un po 'fuorviante. – Tommy

+1

Quello che voglio dire è che rimane nei dati temporanei finché non lo leggi, non importa se si tratta di due richieste o 10 in mezzo. Ma capisco il tuo punto e elaborerò. – jgauffin

+0

+1 per ViewBag - evitalo. –

3

TempData

è destinata ad essere un molto breve esempio, e si dovrebbe utilizzare solo durante l'attuale e solo le richieste successive! Dato che TempData funziona in questo modo, è necessario sapere con certezza quale sarà la richiesta successiva e il reindirizzamento a un'altra vista è l'unica volta in cui è possibile garantirlo. Pertanto, l'unico scenario in cui l'utilizzo di TempData funzionerà in modo affidabile è quando si sta reindirizzando. Questo perché un reindirizzamento uccide la richiesta corrente (e invia il codice di stato HTTP 302 Oggetto spostato al client), quindi crea una nuova richiesta sul server per servire la vista reindirizzata. Guardando indietro al precedente esempio di codice HomeController significa che l'oggetto TempData potrebbe fornire risultati in modo diverso dal previsto, poiché la successiva origine della richiesta non può essere garantita. Ad esempio, la richiesta successiva può provenire da un'istanza del browser e della macchina completamente diversa.

Viewdata

Viewdata è un oggetto dizionario che si mette i dati in, che diventa quindi disponibili per la visualizzazione. ViewData è un derivato della classe ViewDataDictionary, quindi è possibile accedere tramite la nota sintassi "chiave/valore".

ViewBag

L'oggetto ViewBag è un wrapper intorno all'oggetto Viewdata che permette di creare le proprietà dinamiche per la ViewBag.

public class HomeController : Controller 
{ 
    // ViewBag & ViewData sample 
    public ActionResult Index() 
    { 
     var featuredProduct = new Product 
     { 
      Name = "Special Cupcake Assortment!", 
      Description = "Delectable vanilla and chocolate cupcakes", 
      CreationDate = DateTime.Today, 
      ExpirationDate = DateTime.Today.AddDays(7), 
      ImageName = "cupcakes.jpg", 
      Price = 5.99M, 
      QtyOnHand = 12 
     }; 

     ViewData["FeaturedProduct"] = featuredProduct; 
     ViewBag.Product = featuredProduct; 
     TempData["FeaturedProduct"] = featuredProduct; 

     return View(); 
    } 
} 
0
namespace TempData.Controllers 
{ 
public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     TempData["hello"] = "test"; // still alive 
     return RedirectToAction("About"); 
    } 

    public ActionResult About() 
    { 
     //ViewBag.Message = "Your application description page."; 
     var sonename = TempData["hello"]; // still alive (second time) 
     return RedirectToAction("Contact"); 
    } 


    public ActionResult Contact() 
    { 
     var scondtime = TempData["hello"]; // still alive(third time) 
     return View(); 
    } 
    public ActionResult afterpagerender() 
    { 
     var scondtime = TempData["hello"];//now temp data value becomes null 

     return View(); 
    } 
} 

}

In precedenza conversazione, c'è poco confondere per tutti. se guardi il mio codice precedente, tempdata è come il concetto di viewdata ma poi è in grado di reindirizzare anche l'altra vista. questo è il primo punto.

secondo punto: pochi di loro dicono che mantiene valore fino a leggere e alcuni di loro chiedono che così leggerà solo il tempo? non così. In realtà, puoi leggere un numero qualsiasi di volte all'interno del tuo codice in un postpack prima del rendering della pagina. una volta eseguito il rendering della pagina, se si esegue nuovamente il comando postpack (richiesta), il valore di tempdata diventa NULL.

anche se si richiede così tanto tempo, ma il valore di tempdata è ancora attivo -> in questo caso il numero di richiesta non dovrebbe leggere il valore dei dati temporanei.