2013-03-04 14 views
10

Mit ViewData und ViewBag können Sie auf alle Daten in der Ansicht zugreifen, die vom Controller übergeben wurden.ViewBag, ViewData, TempData, Session - wie und wann?

Der Hauptunterschied zwischen diesen beiden ist die Art, wie Sie auf die Daten zugreifen. In ViewBag greifen Sie auf Daten zu, die Zeichenfolge als Schlüssel verwenden - ViewBag ["numbers"] In ViewData greifen Sie auf Daten zu, die Eigenschaften verwenden - ViewData.numbers.

Viewdata Beispiel

CONTROLLER

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

      ViewData["numbers"] = Numbers; 

VIEW

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

</ul> 

ViewBag Beispiel

CONTROLLER

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

     ViewBag.numbers = Numbers; 

VIEW

<ul> 

@foreach (var number in ViewBag.numbers) 

{ 
<li>@number</li> 
} 

</ul> 

Session ist ein weiteres sehr nützliches Objekt, das keine Informationen halten wird.

Zum Beispiel, wenn sich der Benutzer am System anmeldet und die Berechtigungsstufe beibehalten werden soll.

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

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

Diese Informationen werden solange Benutzersitzung ist aktiv in Session gespeichert werden. Dies kann in Web.config-Datei geändert werden:

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

So dann in der Steuerung innerhalb der Aktion:

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

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

     return View("AccessDenied"); 
    } 

TempData ist sehr ähnlich wie Viewdata und ViewBag jedoch nur Daten enthalten für eine Bitte.

CONTROLLER

// Sie haben eine Methode, um neuen Client hinzuzufügen.

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

VIEW

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

TempData ist nützlich, wenn Sie einige Informationen von View-Controller zu übergeben möchten. Zum Beispiel möchten Sie Zeit halten, als die Ansicht angefordert wurde.

VIEW

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

CONTROLLER

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

Vielen Dank für weitere Informationen! Das sollte für die meisten Menschen sehr hilfreich sein. –

+0

Gibt es hier eine Frage oder ist das ein Blogbeitrag? Es ist in Ordnung, Ihre eigene Frage zu beantworten, aber es sollte als Antwort und nicht als Teil der Frage erfolgen. Noch wichtiger ist, dass dieses Material bereits zuvor behandelt wurde, z. B. [Was ist der richtige Zeitpunkt für ViewData, ViewBag, Session, TempData] (http://stackoverflow.com/questions/12676924/what-is-the-right-time -for-viewdata-viewbag-session-tempdata) –

+0

Ich werde mich daran erinnern, für die Zukunft und tut mir leid. Ich habe versucht, einige Beispiele zu nennen und vielleicht teilen auch einige erfahrenere Entwickler ihre Erfahrungen mit. –

Antwort

11

ViewBag, Viewdata, TempData, Session - wie und wann sie zu benutzen?

ViewBag

es vermeiden. Verwenden Sie ein Ansichtsmodell, wenn Sie können.

Der Grund ist, dass wenn Sie dynamische Eigenschaften verwenden, keine Kompilierungsfehler auftreten. Es ist wirklich einfach, einen Eigenschaftsnamen zufällig oder nach Zweck zu ändern und dann zu vergessen, alle Verwendungen zu aktualisieren.

Wenn Sie ein ViewModel verwenden, haben Sie dieses Problem nicht. Ein Ansichtsmodell verschiebt auch die Verantwortung, das "M" (d. H. Geschäftsentitäten) in MVC von der Steuerung und der Ansicht an das Ansichtsmodell anzupassen, so dass Sie saubereren Code mit klaren Verantwortlichkeiten erhalten.

Aktion

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

Ansicht (Rasierapparat Syntax)

@ViewBag.SomeProperty 

Viewdata

Avoit es.Verwenden Sie ein Ansichtsmodell, wenn Sie können. Der gleiche Grund wie für ViewBag.

Aktion

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

Ansicht (Rasierapparat-Syntax):

@ViewData["SomeProperty"] 

Temp Daten

Alles, was Sie speichern in TempData wird in TempData bleiben, bis Sie es lesen, egal ob eine oder mehrere HTTP-Anfragen dazwischen liegen.

Aktionen

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


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

"Wenn Sie Informationen über mehrere Anfragen persistieren müssen" - Ich denke TempData ist nur gut, bis es gelesen wird. Ich denke, die Verwendung mehrerer Anfragen hier ist ein wenig irreführend. – Tommy

+1

Was ich meine ist, dass es in den Temp Daten bleibt, bis Sie es lesen, egal ob es zwei Anfragen oder 10 dazwischen ist. Aber ich verstehe, worauf Sie eingehen werden. – jgauffin

+0

+1 für ViewBag - vermeiden Sie es –

3

TempData

soll ein sehr kurzlebig Instanz sein, und Sie sollten es nur während der aktuellen Verwendung und die nachfolgenden Anfragen nur! Da TempData auf diese Weise funktioniert, müssen Sie genau wissen, was die nächste Anfrage sein wird, und das Umleiten zu einer anderen Ansicht ist die einzige Zeit, in der Sie dies garantieren können. Daher ist das einzige Szenario, in dem TempData zuverlässig verwendet wird, das Umleiten. Dies liegt daran, dass eine Umleitung die aktuelle Anforderung beendet (und den HTTP-Statuscode 302 Object Moved an den Client sendet) und anschließend eine neue Anforderung auf dem Server erstellt, um die umgeleitete Ansicht zu bedienen. Ein Rückblick auf das vorherige HomeController-Codebeispiel bedeutet, dass das TempData-Objekt möglicherweise andere Ergebnisse liefert als erwartet, da der nächste Anfrageursprung nicht garantiert werden kann. Zum Beispiel kann die nächste Anfrage von einer komplett anderen Maschine und Browser-Instanz stammen.

Viewdata

Viewdata ist ein Wörterbuch-Objekt, das Sie Daten in, setzen, die dann zur Ansicht verfügbar wird. ViewData ist eine Ableitung der ViewDataDictionary-Klasse, auf die Sie mit der bekannten "Schlüssel/Wert" -Syntax zugreifen können.

ViewBag

Das ViewBag Objekt ein Wrapper um das Viewdata-Objekt, das Sie dynamische Eigenschaften für die ViewBag erstellen kann.

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 oben Gespräch, gibt es wenig confuse für jedermann. Wenn Sie sich meinen obigen Code ansehen, ist Tempdata wie viewdata concept, aber es ist auch in der Lage, andere Views umzuleiten. Das ist der erste Punkt.

zweiter Punkt: einige von ihnen sagen, es behält den Wert bis gelesen und nur wenige von ihnen fragen, dass wird es nur Zeit lesen? Nicht so. Eigentlich können Sie eine beliebige Anzahl von Zeit in Ihrem Code in einem Post-Pack vor dem Rendern der Seite lesen. Sobald die Seitenwiedergabe passiert ist, bedeutet dies, dass der Wert für tempdata zu NULL wird, wenn Sie erneut postpack (request) ausführen.

Auch Sie bitten so viele Zeit, aber der Tempdata-Wert ist noch am Leben -> dieser Fall sollte Ihre Anzahl von Anfrage nicht lesen Temp Datenwert.

Verwandte Themen