web-dev-qa-db-de.com

ViewBag, ViewData und TempData

Könnte jeder Körper erklären, wann er benutzt wird 

  1. TempData
  2. ViewBag
  3. Daten anzeigen

Ich habe eine Anforderung, bei der ich einen Wert in einem Controller 1 einstellen muss, dieser Controller wird zu Controller 2 umgeleitet, und Controller 2 rendert die Ansicht.

Ich habe versucht, ViewBag zu verwenden. Der Wert geht bei Erreichen von Controller Two verloren.

Kann ich wissen, wann man Vor- und Nachteile einsetzt? 

Vielen Dank

200
Hari Gillala

1) TempData 

Ermöglicht das Speichern von Daten, die für eine Weiterleitung erhalten bleiben. Intern verwendet er die Sitzung als Sicherungsspeicher, nachdem die Umleitung durchgeführt wurde, werden die Daten automatisch gelöscht. 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"]

ViewBag ist nur ein dynamischer Wrapper um ViewData und ist nur in ASP.NET MVC 3 vorhanden.

Davon abgesehen, sollte keines dieser beiden Konstrukte verwendet werden. Sie sollten Ansichtsmodelle und stark typisierte Ansichten verwenden. Das richtige Muster ist also folgendes:

Modell anzeigen:

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

Aktion:

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

Stark typisierte Ansicht:

@model MyViewModel
@Model.Foo

Nach dieser kurzen Einführung beantworten wir Ihre Frage:

Meine Anforderung ist, dass ich einen Wert in einem Controller einstellen möchte, nämlich den Controller leitet zu ControllerTwo um, Controller2 rendert die Aussicht.

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 F5 auf der Zielseite drückt, gehen die Daten verloren.

Persönlich verwende ich auch keine TempData. Dies liegt daran, dass intern die Sitzung verwendet wird und ich die Sitzung in meinen Anwendungen deaktiviere. Ich bevorzuge eine REST-Methode, um dies zu erreichen. Das heißt: In der ersten Controller-Aktion, die die Umleitung durchführt, speichern Sie das Objekt in Ihrem Datenspeicher und Benutzer die generierte eindeutige ID, wenn Sie die Umleitung durchführen. Dann verwenden Sie bei der Zielaktion diese ID, um das ursprünglich gespeicherte Objekt abzurufen:

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.

283
Darin Dimitrov

ASP.NET MVC bietet drei Optionen: ViewData, ViewBag und TempData, um Daten vom Controller zur Ansicht und in der nächsten Anforderung zu übergeben. ViewData und ViewBag sind fast identisch und TempData übernimmt zusätzliche Verantwortung. Lassen Sie uns auf diese drei Objekte wichtige Punkte besprechen oder abrufen:

Ä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 bei einer Umleitung zu Null wird. Dies ist .__, da ihr Ziel darin besteht, eine Möglichkeit zur Kommunikation zwischen Controllern und Ansichten bereitzustellen. Es handelt sich um einen Kommunikationsmechanismus innerhalb des Serveranrufs

Unterschied zwischen ViewBag und ViewData:

  • ViewData ist ein Wörterbuch von Objekten, das von der ViewDataDictionary-Klasse abgeleitet ist und über Strings als Schlüssel zugänglich ist.
  • ViewBag ist eine dynamische Eigenschaft, die die neuen dynamischen Features in C # 4.0 nutzt.
  • ViewData erfordert die Typumwandlung für einen komplexen Datentyp und die Ü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 von der TempDataDictionary-Klasse abgeleitetes Wörterbuch, das in einer Sitzung mit kurzer Lebensdauer gespeichert wird. Es handelt sich um einen String-Schlüssel und einen Objektwert. Der Unterschied ist 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, "TempData" hilft bei der Weiterleitung, Daten zwischen diesen Weiterleitungen zu verwalten. Es verwendet intern Sitzungsvariablen. Die Verwendung temporärer Daten während der aktuellen und der nachfolgenden Anforderung bedeutet nur, dass sie verwendet wird, wenn Sie sicher sind, dass die nächste Anforderung zur nächsten Ansicht weitergeleitet wird. Es erfordert eine Typumwandlung für einen komplexen Datentyp und eine Überprüfung auf Nullwerte, um Fehler zu vermeiden. In der Regel werden nur einmalige Meldungen wie Fehlermeldungen und Überprüfungsmeldungen gespeichert.

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 Session, die wie ViewData funktioniert, wie ein Dictionary, das eine Zeichenfolge als Schlüssel und ein Objekt als Wert verwendet. Dieses wird im Client-Cookie gespeichert und kann viel länger verwendet werden. Es muss auch mehr überprüft werden, 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 verwenden, um nicht zusammenhängende Daten aufzufüllen, die Ihren Controller verschmutzen können.

15
Abdur Rahman

TempData

Im Grunde ist es wie ein DataReader. Sobald Daten gelesen werden, gehen Daten verloren.

Dieses Video überprüfen

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 auf den obigen Code achten, hat RedirectToAction keine Auswirkungen auf TempData, bis TempData gelesen wird. Sobald TempData gelesen wird, gehen die Werte verloren. 

Wie kann ich die TempData nach dem Lesen behalten?

Überprüfen Sie die Ausgabe in Aktion Method 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 Daten nach RedirectToAction sowie nach dem Lesen der Daten nicht verloren und der Grund ist: Wir verwenden TempData.Keep(). ist dass 

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

ViewBag/ViewData

Die Daten bleiben in der entsprechenden Ansicht erhalten

11
user2377970

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

Weiterlesen

4
Anil Sharma

ViewBag, ViewData, TempData und View State in MVC

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

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

Ähnlichkeiten zwischen ViewBag & ViewData:

Hilft beim Verwalten von Daten, wenn Sie vom Controller zur Ansicht wechseln. Gewöhnt an Daten vom Controller an die entsprechende Ansicht übergeben. Kurzes Leben bedeutet Der Wert wird bei der Umleitung zu Null. Dies ist, weil ihr Ziel ist eine Möglichkeit, zwischen Controllern und Ansichten zu kommunizieren. Es ist ein Kommunikationsmechanismus innerhalb des Serveraufrufs.

Unterschied zwischen ViewBag und ViewData:

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

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 an:

@ViewBag.Name   
@ViewData["Name"]

TempData:

Hilft beim Verwalten von Daten, wenn Sie von einem Controller zu einem anderen wechseln Controller oder von einer Aktion zu anderen Aktion. Mit anderen Worten, wenn Sie Weiterleitung, "Tempdata" hilft, Daten zwischen diesen Weiterleitungen zu verwalten. Es verwendet intern Sitzungsvariablen. TempData soll ein sehr .__ sein. kurzlebige Instanz, und Sie sollten es nur während der aktuellen .__ verwenden. und nur die nachfolgenden Anfragen

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

Es erfordert eine Typumwandlung für einen komplexen Datentyp 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);   
}  
3
Arun Prakash
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
    } 
1
Saineshwar

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 schnelle Nachricht an die Ansicht zu übergeben, die nach dem ersten Lesen verschwunden ist . ViewBag .__ Wenn Sie ein Datenstück schnell an die Ansicht übergeben, sollten Sie normalerweise alle Daten an die Ansicht durch das Modell übergeben. Es gibt jedoch Fälle, in denen das Modell direkt von einer Klasse stammt, die in eine Datenbank wie das Entity-Framework aufgenommen wird Was Sie ändern müssen, um ein neues Datenelement zu übergeben, können Sie dies in den Viewbag .__ einbinden. ViewData ist nur eine indizierte Version von ViewBag und wurde vor MVC3 verwendet 

1
David Fawzy

Auch der Geltungsbereich unterscheidet sich zwischen viewbag und temptdata. viewbag basiert auf der ersten Ansicht (wird nicht von Aktionsmethoden geteilt), aber temptdata kann von einer Aktionsmethode und nur von einer anderen geteilt werden.

0
Elnaz