ViewBag, ViewData und TempData

209

Könnte jeder Körper erklären, wann man es benutzt

  1. TempData
  2. ViewBag
  3. Daten anzeigen

Ich habe eine Anforderung, bei der ich einen Wert in einem Controller eins festlegen muss, dass der Controller zu Controller Zwei umleitet und Controller Zwei die Ansicht rendert.

Ich habe versucht, ViewBag zu verwenden. Der Wert geht verloren, wenn ich Controller Zwei erreiche.

Kann ich wissen, wann und welche Vor- oder Nachteile ich verwenden soll?

Vielen Dank

Hari Gillala
quelle
5
Dies ist ein großartiger Beitrag, der die Unterschiede erklärt.
Beku
1
stackoverflow.com/a/17199709/2015869
Imad Alazani
2
Überprüfen Sie diese ViewData Vs ViewBag Vs TempData
user2794034

Antworten:

293

1) TempData

Ermöglicht das Speichern von Daten, die für eine Umleitung überleben. Intern wird die Sitzung als Sicherungsspeicher verwendet. Nach der Umleitung werden die Daten automatisch entfernt. Das Muster ist das folgende:

public ActionResult Foo()
{
    // store something into the tempdata that will be available during a single redirect
    TempData["foo"] = "bar";

    // you should always redirect if you store something into TempData to
    // a controller action that will consume this data
    return RedirectToAction("bar");
}

public ActionResult Bar()
{
    var foo = TempData["foo"];
    ...
}

2) ViewBag, ViewData

Ermöglicht das Speichern von Daten in einer Controller-Aktion, die in der entsprechenden Ansicht verwendet wird. Dies setzt voraus, dass die Aktion eine Ansicht zurückgibt und nicht umleitet. Lebt nur während der aktuellen Anfrage.

Das Muster ist das folgende:

public ActionResult Foo()
{
    ViewBag.Foo = "bar";
    return View();
}

und in der Ansicht:

@ViewBag.Foo

oder mit ViewData:

public ActionResult Foo()
{
    ViewData["Foo"] = "bar";
    return View();
}

und in der Ansicht:

@ViewData["Foo"]

ViewBagist nur ein dynamischer Wrapper ViewDataund existiert nur in ASP.NET MVC 3.

Abgesehen davon sollte keines dieser beiden Konstrukte jemals verwendet werden. Sie sollten Ansichtsmodelle und stark typisierte Ansichten verwenden. Das richtige Muster lautet also wie folgt:

Modell anzeigen:

public class MyViewModel
{
    public string Foo { get; set; }
}

Aktion:

public Action Foo()
{
    var model = new MyViewModel { Foo = "bar" };
    return View(model);
}

Stark getippte Ansicht:

@model MyViewModel
@Model.Foo

Nach dieser kurzen Einführung beantworten wir Ihre Frage:

Meine Anforderung ist, dass ich einen Wert in einem Controller festlegen möchte. Dieser Controller leitet zu ControllerTwo um und Controller2 rendert die Ansicht.

public class OneController: Controller
{
    public ActionResult Index()
    {
        TempData["foo"] = "bar";
        return RedirectToAction("index", "two");
    }
}

public class TwoController: Controller
{
    public ActionResult Index()
    {
        var model = new MyViewModel
        {
            Foo = TempData["foo"] as string
        };
        return View(model);
    }
}

und die entsprechende Ansicht ( ~/Views/Two/Index.cshtml):

@model MyViewModel
@Html.DisplayFor(x => x.Foo)

Die Verwendung von TempData hat auch Nachteile: Wenn der Benutzer auf der Zielseite F5 drückt, gehen die Daten verloren.

Persönlich benutze ich TempData auch nicht. Dies liegt daran, dass intern die Sitzung verwendet wird und ich die Sitzung in meinen Anwendungen deaktiviere. Ich bevorzuge einen ruhigeren Weg, um dies zu erreichen. Das heißt: In der ersten Controller-Aktion, die die Umleitung ausführt, speichern Sie das Objekt in Ihrem Datenspeicher und verwenden Sie die generierte eindeutige ID beim Umleiten. Verwenden Sie dann für die Zielaktion diese ID, um das ursprünglich gespeicherte Objekt zurückzurufen:

public class OneController: Controller
{
    public ActionResult Index()
    {
        var id = Repository.SaveData("foo");
        return RedirectToAction("index", "two", new { id = id });
    }
}

public class TwoController: Controller
{
    public ActionResult Index(string id)
    {
        var model = new MyViewModel
        {
            Foo = Repository.GetData(id)
        };
        return View(model);
    }
}

Die Ansicht bleibt gleich.

Darin Dimitrov
quelle
57
Gute Antwort, aber ich bin nicht einverstanden mit der dogmatischen Aussage "Keines dieser beiden Konstrukte sollte jemals verwendet werden". Ich habe ein paar legitime Verwendungen für den ViewBag gefunden. Zum Beispiel habe ich ViewBag.Titlefür alle meine Ansichten eine Eigenschaft festgelegt, die in meiner verwendet wird_Layout.cshtml Basisansichtsdatei verwendet wird. Ein anderer Fall, in dem ich es benutze, ist das Versenden von Info-Nachrichten (z. B. "Produkt erfolgreich gespeichert!") An die Benutzer. Ich habe ein generisches Markup eingefügt Layout.cshtml, um eine Nachricht zu rendern, falls vorhanden. Dadurch kann ich eine ViewBag.Messagebeliebige Aktion festlegen . Die Verwendung einer ViewModel-Eigenschaft in beiden Fällen hat zu viele Nachteile.
Jesse Webb
22
Ich muss Jesse zustimmen, obwohl dies eine ausgezeichnete Beschreibung ist. Es ist eine Ansichtssache, keine Tatsache, dass es keinen guten Grund gibt, ViewBag zu verwenden. Es ist sicherlich eine schlechte Praxis, den ViewBag zu überbeanspruchen, und einige Entwickler geraten in diese Falle, aber geschmackvoll eingesetzt ist er eine leistungsstarke Ressource.
Ron DeFreitas
1
@ ron.defreitas, okay, sag mir dann einen guten Grund, warum du verwenden würdest ViewBag. Bitte beschreiben Sie ein bestimmtes reales Szenario, wenn ViewBag eine Verwendung hat. Da Sie sagen , dass es ist, ich zitiere eine leistungsstarke Ressource , ich denke , Sie einige spezifische Fälle, wo diese leistungsfähige Ressource ist mächtig . Da ich es in meiner Karriere noch nie benutzt habe, würde ich mich sehr freuen zu erfahren, wie Menschen diese mächtige Waffe benutzen.
Darin Dimitrov
27
Wir haben hier einen Elitisten. Darin, Jesse erwähnte ausdrücklich ein solches Beispiel. Nur weil es immer andere Möglichkeiten gibt, Dinge zu tun, wird ihre Nützlichkeit nicht automatisch negiert.
Djentleman
2
@DarinDimitrov: Ich habe gerade ein Szenario, in dem ich einige Informationen aus einer Attributmethode an die Ansicht übergeben muss. Die Verwendung von filterContext.Controller.ViewData ist wesentlich einfacher als der Versuch, sie an eine stark typisierte Ansicht zu übergeben. Das heißt, danke für Ihre Erklärung, es war sehr nützlich.
Andy
15

ASP.NET MVC bietet drei Optionen: ViewData, ViewBag und TempData zum Übergeben von Daten vom Controller an die Ansicht und bei der nächsten Anforderung. ViewData und ViewBag sind sich fast ähnlich und TempData übernimmt zusätzliche Verantwortung. Lassen Sie uns wichtige Punkte zu diesen drei Objekten diskutieren oder erhalten:

Ähnlichkeiten zwischen ViewBag & ViewData:

  • Hilft beim Verwalten von Daten, wenn Sie vom Controller zur Ansicht wechseln.
  • Wird verwendet, um Daten vom Controller an die entsprechende Ansicht zu übergeben.
  • Kurze Lebensdauer bedeutet, dass der Wert null wird, wenn eine Umleitung erfolgt. Dies liegt daran, dass ihr Ziel darin besteht, eine Möglichkeit zur Kommunikation zwischen Controllern und Ansichten bereitzustellen. Es ist ein Kommunikationsmechanismus innerhalb des Serveraufrufs.

Unterschied zwischen ViewBag & ViewData:

  • ViewData ist ein Wörterbuch von Objekten, das von der ViewDataDictionary-Klasse abgeleitet ist und über Zeichenfolgen als Schlüssel zugänglich ist.
  • ViewBag ist eine dynamische Eigenschaft, die die neuen dynamischen Funktionen in C # 4.0 nutzt.
  • ViewData erfordert eine Typumwandlung für komplexe Datentypen und eine Überprüfung auf Nullwerte, um Fehler zu vermeiden.
  • ViewBag erfordert keine Typumwandlung für komplexe Datentypen.

ViewBag & ViewData Beispiel:

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


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

Im Hinblick auf:

@ViewBag.Name 
@ViewData["Name"] 

TempData:

TempData ist auch ein Wörterbuch, das von der TempDataDictionary-Klasse abgeleitet und in einer Sitzung mit kurzer Lebensdauer gespeichert wird. Es ist ein Zeichenfolgenschlüssel und ein Objektwert. Der Unterschied besteht darin, dass der Lebenszyklus des Objekts. TempData speichert die Informationen für die Zeit einer HTTP-Anforderung. Dies bedeutet nur von einer Seite zur anderen. Dies funktioniert auch mit einer 302/303-Umleitung, da sie sich in derselben HTTP-Anforderung befindet. Hilft beim Verwalten von Daten, wenn Sie von einem Controller zu einem anderen Controller oder von einer Aktion zu einer anderen Aktion wechseln. Mit anderen Worten, wenn Sie umleiten, hilft „TempData“ dabei, Daten zwischen diesen Weiterleitungen zu verwalten. Es werden intern Sitzungsvariablen verwendet. Die Verwendung von temporären Daten während der aktuellen und nachfolgenden Anforderung bedeutet nur, dass sie verwendet werden, wenn Sie sicher sind, dass die nächste Anforderung zur nächsten Ansicht umgeleitet wird. Es erfordert eine Typumwandlung für komplexe Datentypen und eine Überprüfung auf Nullwerte, um Fehler zu vermeiden.

public ActionResult Index()
{
  var model = new Review()
            {
                Body = "Start",
                Rating=5
            };
    TempData["ModelName"] = model;
    return RedirectToAction("About");
}

public ActionResult About()
{
    var model= TempData["ModelName"];
    return View(model);
}

Der letzte Mechanismus ist die Sitzung, die wie die ViewData funktioniert, wie ein Wörterbuch, das eine Zeichenfolge für Schlüssel und ein Objekt für Wert verwendet. Dieser wird im Client-Cookie gespeichert und kann viel länger verwendet werden. Es bedarf auch weiterer Überprüfungen, um niemals vertrauliche Informationen zu erhalten. In Bezug auf ViewData oder ViewBag sollten Sie es intelligent für die Anwendungsleistung verwenden. Weil jede Aktion den gesamten Lebenszyklus einer regulären asp.net mvc-Anfrage durchläuft. Sie können ViewData / ViewBag in Ihrer untergeordneten Aktion verwenden. Achten Sie jedoch darauf, dass Sie es nicht zum Auffüllen der nicht verwandten Daten verwenden, die Ihren Controller verschmutzen können.

Abdur Rahman
quelle
11

TempData

Im Grunde ist es wie bei einem DataReader, wenn Daten gelesen werden, gehen sie verloren.

Überprüfen Sie dieses Video

Beispiel

public class HomeController : Controller
{
    public ActionResult Index()
    {
        ViewBag.Message = "Welcome to ASP.NET MVC!";
        TempData["T"] = "T";
        return RedirectToAction("About");
    }

    public ActionResult About()
    {
        return RedirectToAction("Test1");
    }

    public ActionResult Test1()
    {
        String str = TempData["T"]; //Output - T
        return View();
    }
}

Wenn Sie den obigen Code beachten, hat RedirectToAction keine Auswirkungen auf die TempData, bis TempData gelesen wird. Sobald TempData gelesen wird, gehen Werte verloren.

Wie kann ich die TempData nach dem Lesen behalten?

Überprüfen Sie die Ausgabe in Aktionsmethode Test 1 und Test 2

public class HomeController : Controller
{
    public ActionResult Index()
    {
        ViewBag.Message = "Welcome to ASP.NET MVC!";
        TempData["T"] = "T";
        return RedirectToAction("About");
    }

    public ActionResult About()
    {
        return RedirectToAction("Test1");
    }

    public ActionResult Test1()
    {
        string Str = Convert.ToString(TempData["T"]);
        TempData.Keep(); // Keep TempData
        return RedirectToAction("Test2");
    }

    public ActionResult Test2()
    {
        string Str = Convert.ToString(TempData["T"]); //OutPut - T
        return View();
    }
}

Wenn Sie auf den obigen Code achten, gehen nach RedirectToAction sowie nach dem Lesen der Daten keine Daten verloren. Der Grund dafür ist, dass wir verwenden TempData.Keep(). ist dass

Auf diese Weise können Sie es auch in anderen Controllern so lange beibehalten, wie Sie möchten.

ViewBag / ViewData

Die Daten bleiben in der entsprechenden Ansicht erhalten


quelle
4

TempData in Asp.Net MVC ist eine der sehr nützlichen Funktionen. Es wird verwendet, um Daten von der aktuellen Anforderung an die nachfolgende Anforderung zu übergeben. Mit anderen Worten, wenn wir während der Umleitung Daten von einer Seite auf eine andere Seite senden möchten, können wir TempData verwenden, aber wir müssen einige Überlegungen im Code anstellen, um diese Funktion in MVC zu erreichen. Weil die Lebensdauer von TempData sehr kurz ist und nur so lange liegt, bis die Zielansicht vollständig geladen ist. Wir können jedoch die Keep () -Methode verwenden, um Daten in TempData beizubehalten.

Weiterlesen

Anil Sharma
quelle
3

ViewBag, ViewData, TempData und View State in MVC

http://royalarun.blogspot.in/2013/08/viewbag-viewdata-tempdata-and-view.html

ASP.NET MVC bietet uns drei Optionen: ViewData, VieBag und TempData, um Daten vom Controller zur Ansicht und bei der nächsten Anforderung zu übergeben. ViewData und ViewBag sind sich fast ähnlich und TempData übernimmt zusätzliche Verantwortung.

Ähnlichkeiten zwischen ViewBag & ViewData:

Hilft beim Verwalten von Daten, wenn Sie vom Controller zur Ansicht wechseln. Wird verwendet, um Daten vom Controller an die entsprechende Ansicht zu übergeben. Kurze Lebensdauer bedeutet, dass der Wert null wird, wenn eine Umleitung erfolgt. Dies liegt daran, dass ihr Ziel darin besteht, eine Möglichkeit zur Kommunikation zwischen Controllern und Ansichten bereitzustellen. Es ist ein Kommunikationsmechanismus innerhalb des Serveraufrufs.

Unterschied zwischen ViewBag & ViewData:

ViewData ist ein Wörterbuch von Objekten, das von der ViewDataDictionary-Klasse abgeleitet ist und über Zeichenfolgen als Schlüssel zugänglich ist. ViewBag ist eine dynamische Eigenschaft, die die neuen dynamischen Funktionen in C # 4.0 nutzt. ViewData erfordert eine Typumwandlung für komplexe Datentypen und eine Überprüfung auf Nullwerte, um Fehler zu vermeiden. ViewBag erfordert keine Typumwandlung für komplexe Datentypen.

ViewBag & ViewData Beispiel:

public ActionResult Index()

{  
    ViewBag.Name = "Arun Prakash";
    return View();    
}

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

In View rufen wir wie folgt auf:

@ViewBag.Name   
@ViewData["Name"]

TempData:

Hilft beim Verwalten von Daten, wenn Sie von einem Controller zu einem anderen Controller oder von einer Aktion zu einer anderen Aktion wechseln. Mit anderen Worten, wenn Sie umleiten, hilft „Tempdata“ dabei, Daten zwischen diesen Weiterleitungen zu verwalten. Es werden intern Sitzungsvariablen verwendet. TempData ist als sehr kurzlebige Instanz gedacht und sollte nur während der aktuellen und der nachfolgenden Anforderungen verwendet werden

Das einzige Szenario, in dem die Verwendung von TempData zuverlässig funktioniert, ist die Umleitung. Dies liegt daran, dass eine Umleitung die aktuelle Anforderung beendet (und den HTTP-Statuscode 302 Objekt an den Client verschoben sendet) und dann eine neue Anforderung auf dem Server erstellt, um die umgeleitete Ansicht bereitzustellen.

Es erfordert eine Typumwandlung für komplexe Datentypen und eine Überprüfung auf Nullwerte, um Fehler zu vermeiden.

public ActionResult Index()
{   
   var model = new Review()  
   {  
      Body = "Start",  
      Rating=5  
   };  

    TempData["ModelName"] = model;    
    return RedirectToAction("About");   
} 

public ActionResult About()       
{  
    var model= TempData["ModelName"];  
    return View(model);   
}  
Arun Prakash
quelle
1
void Keep()

Calling this method with in the current action ensures that all the items in TempData are not removed at the end of the current request.

    @model MyProject.Models.EmpModel;
    @{
    Layout = "~/Views/Shared/_Layout.cshtml";
    ViewBag.Title = "About";
    var tempDataEmployeet = TempData["emp"] as Employee; //need typcasting
    TempData.Keep(); // retains all strings values
    } 

void Keep(string key)

Calling this method with in the current action ensures that specific item in TempData is not removed at the end of the current request.

    @model MyProject.Models.EmpModel;
    @{
    Layout = "~/Views/Shared/_Layout.cshtml";
    ViewBag.Title = "About";
    var tempDataEmployeet = TempData["emp"] as Employee; //need typcasting
    TempData.Keep("emp"); // retains only "emp" string values
    } 
Saineshwar
quelle
1

TempData ist immer bis zum ersten Lesen verfügbar. Sobald Sie es gelesen haben, ist es nicht mehr verfügbar. Es kann nützlich sein, eine Kurznachricht zu übergeben, um auch anzuzeigen, dass sie nach dem ersten Lesen nicht mehr angezeigt wird. ViewBag Es ist nützlicher, wenn Sie schnell Daten an die Ansicht übergeben. Normalerweise sollten Sie alle Daten über das Modell an die Ansicht übergeben. In einigen Fällen kommt das Modell jedoch direkt aus einer Klasse, die in einem datenbankähnlichen Entity-Framework zugeordnet ist Wenn Sie Ihr Modell nicht ändern möchten, um neue Daten zu übergeben, können Sie dies in den Viewbag stecken. ViewData ist nur eine indizierte Version von ViewBag und wurde vor MVC3 verwendet

David Fawzy
quelle
0

Auch der Umfang unterscheidet sich zwischen Viewbag und Versuchendaten. viewbag basiert auf der ersten Ansicht (nicht zwischen Aktionsmethoden geteilt), aber Versuchungsdaten können zwischen einer Aktionsmethode und nur untereinander geteilt werden.

Elnaz
quelle