Sök…


Introduktion

ViewData och ViewBag används för att överföra data från controller till view.

ViewData är inget annat än en ordlista med objekt och det är tillgängligt med sträng som nyckel.

ViewBag liknar ViewData. ViewBag är en dynamisk egenskap. ViewBag är bara ett omslag runt ViewData.

TempData behåller data under tiden för HTTP Request, vilket innebär att det innehåller data mellan två på varandra följande förfrågningar. TempData hjälper oss att överföra data mellan kontrollerare eller mellan handlingar. Internt använder session.

Syntax

  1. ViewData [key] = värde;

  2. ViewBag.Key = värde;

  3. TempData [nyckel] = värde;

Vad är ViewData, ViewBag och TempData?

ViewData är mekanismen för en controller att tillhandahålla data till den vy som den presenterar, utan att använda en ViewModel. Specifikt är ViewData en ordlista som är tillgänglig både i MVC-handlingsmetoder och vyer. Du kan använda ViewData för att överföra data från din åtgärdsmetod till den vy som returneras av åtgärdsmetoden.

Eftersom det är en ordlista kan du använda ordboken som syntax för att ställa in och hämta data från den.

ViewData[key] = value; // In the action method in the controller

Om du till exempel vill skicka ett strängmeddelande från din Index-metod till din Index.cshtml kan du göra det.

public ActionResult Index()
{
   ViewData["Message"] = "Welcome to ASP.NET MVC";
   return View(); // notice the absence of a view model
}

För att komma åt detta i din Index.cshtml vy kan du helt enkelt öppna ViewData-ordboken med nyckeln som används i åtgärdsmetoden.

<h2>@ViewData["Message"]</h2>

ViewBag är den dynamiska motsvarigheten till den otypade ViewData-ordboken. Det drar fördel av C # dynamic typ för syntaktisk sockerupplevelse.

Syntaxen för att ställa in vissa data till ViewBag är

ViewBag.Key = Value;

Så om vi vill skicka meddelandesträngen i vårt tidigare exempel med ViewBag kommer det att vara det

public ActionResult Index()
{
   ViewBag.Message = "Welcome to ASP.NET MVC";
   return View(); // not the absence of a view model
}

och i din indexvy,

<h2>@ViewBag.Message</h2>

Data delas inte mellan ViewBag och ViewData. ViewData kräver typkasting för att hämta data från komplexa datatyper och kontrollera om nollvärden för att undvika fel där View Bag inte kräver typkasting.

TempData kan användas när du vill fortsätta data mellan en http-begäran och nästa HTTP-begäran. Livslängden på data lagrade i TempDataDiction upphör efter den andra begäran. Så TempData är användbar i scenarier där du följer PRG-mönstret.

[HttpPost]
public ActionResult Create(string name)
{
   // Create a user
   // Let's redirect (P-R-G Pattern)
   TempData["Message"] = "User created successfully";
   return RedirectToAction("Index");
}
public ActionResult Index()
{
  var messageFromPreviousCall = TempData["Message"] as String;
  // do something with this message
  // to do : Return something
}

När vi return RedirectToAction("SomeActionMethod") kommer servern att skicka ett 302-svar till klienten (webbläsaren) med platshuvudvärde inställt på URL till "SomeActionMethod" och webbläsaren kommer att göra en helt ny begäran till det. ViewBag / ViewData fungerar inte i så fall för att dela data mellan dessa två samtal. Du måste använda TempData i sådana scenarier.

TempData livscykel

Data sparade i TempData lagras i sessionen och tas automatiskt bort i slutet av den första begäran där informationen nås. Om den aldrig läses, kommer den att behållas tills den slutligen läses eller sessionen har avslutats.

Den typiska användningen ser ut enligt följande sekvens (där varje rad anropas från en annan begäran):

//first request, save value to TempData
TempData["value"] = "someValueForNextRequest";

//second request, read value, which is marked for deletion
object value = TempData["value"];

//third request, value is not there as it was deleted at the end of the second request
TempData["value"] == null

Detta beteende kan ytterligare styras med Peek and Keep metoderna.

  • Med Peek du hämta data lagrade i TempData utan att markera det för radering, så att data fortfarande är tillgängliga på en framtida begäran

    //first request, save value to TempData
    TempData["value"] = "someValueForNextRequest";
    
    //second request, PEEK value so it is not deleted at the end of the request
    object value = TempData.Peek("value");
    
    //third request, read value and mark it for deletion
    object value = TempData["value"];
    
  • Med Keep du ange att en nyckel som markerades för borttagning faktiskt ska behållas. I det här fallet kräver två metodsamtal att hämta data och spara dem från radering:

    //first request, save value to TempData
    TempData["value"] = "someValueForNextRequest";
    
    //second request, get value marking it from deletion
    object value = TempData["value"];
    //later on decide to keep it
    TempData.Keep("value");
    
    //third request, read value and mark it for deletion
    object value = TempData["value"];
    

Med detta i åtanke, använd Peek när du alltid vill behålla värdet för en annan begäran och använd Keep när du behåller värdet beror på ytterligare logik.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow