ViewBag, ViewData i TempData

Czy ktos moze wyjasnic, kiedy uzywac

  1. TempData
  2. ViewBag
  3. ViewData

Mam Wymaganie, gdzie muszę ustawić wartość w kontrolerze one, że kontroler przekieruje do kontrolera Two, A kontroler Two wyrenderuje Widok.

Próbowałem użyć ViewBag, wartość traci się do czasu osiągnięcia kontrolera dwa.

Czy Mogę wiedzieć, kiedy używać i zalety lub wady?

Thanks

Author: Hari Gillala, 2011-11-03

8 answers

1)TempData

Pozwala na przechowywanie danych, które przetrwają do przekierowania. Wewnętrznie używa sesji jako sklepu do pieczenia, po prostu po wykonaniu przekierowania dane są automatycznie eksmitowane. Wzór jest następujący:

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

Pozwala na przechowywanie danych w akcji kontrolera, która będzie używana w odpowiednim widoku. Zakłada się, że akcja zwraca widok i nie przekierowuje. Lives tylko podczas bieżącego żądania.

Wzór jest następujący:

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

I w widoku:

@ViewBag.Foo

Lub z ViewData:

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

I w widoku:

@ViewData["Foo"]

ViewBag jest tylko dynamicznym opakowaniem wokół ViewData i istnieje tylko w ASP.NET MVC 3.

To powiedziawszy, żadna z tych dwóch konstrukcji nie powinna być nigdy używana. Należy używać modeli widoków i widoków silnie wpisywanych. Tak więc prawidłowy wzór jest następujący:

Widok model:

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

Akcja:

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

Mocno wpisany widok:

@model MyViewModel
@Model.Foo

Po tym krótkim wstępie odpowiemy na twoje pytanie:

Moim wymogiem jest to, że chcę ustawić wartość w kontrolerze, że controller przekieruje do ControllerTwo a Controller2 renderuje Widok.

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);
    }
}

I odpowiedni Widok (~/Views/Two/Index.cshtml):

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

Istnieją również wady korzystania z TempData: jeśli użytkownik naciśnie F5 na strona docelowa dane zostaną utracone.

Osobiście też nie używam TempData. To dlatego, że wewnętrznie używa sesji i wyłączam sesję w moich aplikacjach. Wolę bardziej spokojny sposób, aby to osiągnąć. Czyli: w pierwszej akcji kontrolera, która wykonuje przekierowanie, przechowuj obiekt w magazynie danych, a użytkownik wygeneruje unikalny identyfikator podczas przekierowywania. Następnie w akcji docelowej użyj tego identyfikatora, aby pobrać pierwotnie zapisany obiekt:

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);
    }
}

Widok pozostaje to samo.

 278
Author: Darin Dimitrov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-01 19:46:51

ASP.NET MVC oferuje nam trzy opcje ViewData, ViewBag i TempData do przekazywania danych z kontrolera do view i w następnym żądaniu. ViewData i ViewBag są prawie podobne i TempData wykonuje dodatkową odpowiedzialność. Omówmy lub uzyskamy kluczowe punkty na tych trzech obiektach:

Podobieństwa między ViewBag i ViewData:

  • pomaga zachować dane podczas przechodzenia z kontrolera do widoku.
  • służy do przekazywania danych z kontrolera do odpowiednich widok.
  • Krótkie życie oznacza, że wartość staje się null, gdy nastąpi przekierowanie. To jest ponieważ ich celem jest zapewnienie sposobu komunikowania się między kontrolery i widoki. To mechanizm komunikacji wewnątrz połączenie z serwerem.

Różnica między ViewBag & ViewData:

  • ViewData to słownik obiektów, który pochodzi z Klasa ViewDataDictionary i dostępna za pomocą ciągów znaków jako kluczy.
  • ViewBag to dynamiczna właściwość wykorzystująca nowa dynamika funkcje w C # 4.0.
  • ViewData wymaga typecastingu dla złożonego typu danych i sprawdzania wartości null, aby uniknąć błędu.
  • ViewBag nie wymaga typecastingu dla złożonych typów danych.

Przykład ViewBag & ViewData:

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


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

W Widoku:

@ViewBag.Name 
@ViewData["Name"] 

TempData:

TempData jest również słownikiem pochodzącym z klasy TempDataDictionary i przechowywanym w sesji krótkiego życia i jest kluczem łańcuchowym i wartością obiektu. Na różnica polega na tym, że cykl życia obiektu. TempData przechowuje informacje przez czas żądania HTTP. Oznacza to tylko z jednej strony na drugą. Działa to również z przekierowaniem 302/303, ponieważ jest w tym samym żądaniu HTTP. Pomaga zachować dane podczas przechodzenia z jednego kontrolera do innego kontrolera lub z jednej akcji do drugiej akcji. Innymi słowy, gdy przekierowujesz, "TempData" pomaga zachować dane między tymi przekierowaniami. Wewnętrznie używa zmiennych sesji. Wykorzystanie danych Temp podczas bieżące i późniejsze żądanie oznacza, że jest używane tylko wtedy, gdy jesteś pewien, że następne żądanie będzie przekierowywane do następnego widoku. Wymaga typecasting dla złożonego typu danych i sprawdzić wartości null, aby uniknąć błędu. Zwykle używany do przechowywania tylko wiadomości jednorazowych, takich jak komunikaty o błędach, komunikaty walidacji.

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);
}

Ostatnim mechanizmem jest sesja, która działa jak ViewData, jak słownik, który pobiera ciąg znaków dla klucza i obiektu dla wartości. Ten jest zapisywany w pliku cookie klienta i może być używany przez znacznie dłuższy czas. Wymaga również większej weryfikacji, aby nigdy nie mieć żadnych poufnych informacji. Jeśli chodzi o ViewData lub ViewBag, powinieneś używać go inteligentnie do wydajności aplikacji. Ponieważ każda akcja przechodzi przez cały cykl życia regularnych asp.net wniosek mvc. Możesz użyć ViewData/ViewBag w akcji dziecka, ale uważaj, że nie używasz go do wypełniania niepowiązanych danych, które mogą zanieczyścić kontroler.

 15
Author: Abdur Rahman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-16 16:58:57

TempData

Zasadniczo jest to jak czytnik danych, po przeczytaniu dane zostaną utracone.

Zobacz ten film

Przykład

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();
    }
}

Jeśli zwrócisz uwagę na powyższy kod, RedirectToAction nie ma wpływu na TempData dopóki TempData nie zostanie odczytana. Tak więc, gdy TempData zostanie odczytana, wartości zostaną utracone.

Jak mogę zachować TempData po przeczytaniu?

Sprawdzić wyjście w działaniu metoda Test 1 i 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();
    }
}

Jeśli zwracamy uwagę na powyższy kod, DANE nie są tracone po przekierowaniu, jak również po odczytaniu danych, a powodem jest to, że używamy TempData.Keep(). czy to

W ten sposób możesz sprawić, że będzie ona trwała tak długo, jak chcesz również w innych kontrolerach.

ViewBag / ViewData

Dane będą przechowywane w odpowiednim widoku

 11
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-21 03:52:04

TempData w Asp.Net MVC jest jedną z bardzo przydatnych funkcji. Służy do przekazywania danych z bieżącego żądania do kolejnego żądania. Innymi słowy, jeśli chcemy wysyłać dane z jednej strony na drugą stronę podczas przekierowywania, możemy użyć TempData, ale musimy wziąć pod uwagę w kodzie, aby osiągnąć tę funkcję w MVC. Ponieważ żywotność TempData jest bardzo krótka i leży tylko do pełnego załadowania widoku docelowego. Ale możemy użyć metody Keep (), aby utrzymać dane w TempData.

Czytaj Więcej

 4
Author: Anil Sharma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-10 09:04:02

ViewBag, ViewData, TempData i View State w MVC

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

ASP.NET MVC oferuje nam trzy opcje ViewData, VieBag i TempData do przekazywania danych z kontrolera do view i w następnym żądaniu. ViewData i ViewBag są prawie podobne i TempData wykonuje dodatkową odpowiedzialność.

Podobieństwa między ViewBag i ViewData:

Pomaga utrzymać dane po przejściu z kontrolera do widoku. Używane do przekazywanie danych z kontrolera do odpowiedniego widoku. Krótkie życie oznacza wartość staje się null, gdy nastąpi przekierowanie. To dlatego, że ich celem jest zapewnienie sposobu komunikacji między kontrolerami i widokami. On mechanizm komunikacji w wywołaniu serwera.

Różnica między ViewBag & ViewData:

ViewData to słownik obiektów, który pochodzi z Viewdatadic class i dostępne za pomocą ciągów jako klawiszy. ViewBag jest właściwością dynamiczną, która wykorzystuje nowe funkcje dynamiczne w C # 4.0. ViewData wymaga typecastingu dla złożonego typu danych i sprawdź wartości null, aby uniknąć błędu. ViewBag nie wymaga typecasting dla złożonego typu danych.

Przykład ViewBag & ViewData:

public ActionResult Index()

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

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

W widoku nazywamy tak jak poniżej:

@ViewBag.Name   
@ViewData["Name"]

TempData:

Pomaga zachować dane, gdy przenosisz się z jednego kontroler do innych kontrolera lub od jednej akcji do drugiej akcji. Innymi słowy, kiedy redirect, "Tempdata" pomaga utrzymać dane między tymi przekierowaniami. Wewnętrznie używa zmiennych sesji. TempData ma być bardzo krótkotrwała instancja i należy jej używać tylko podczas bieżącego i tylko kolejne żądania

Jedynym scenariuszem, w którym korzystanie z TempData będzie niezawodnie działać, jest przekierowanie. Dzieje się tak, ponieważ przekierowanie zabija bieżące żądanie (i wysyła kod statusu HTTP 302 obiekt przeniesiony do klienta), a następnie tworzy nowe żądanie na serwerze, aby obsłużyć przekierowany widok.

Wymaga typecastingu dla złożonego typu danych i sprawdzania wartości null, aby uniknąć błędu.

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
Author: Arun Prakash,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-17 11:18:37
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
Author: Saineshwar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-10 06:45:25

TempData będzie zawsze dostępny do pierwszego przeczytania, po przeczytaniu go jego nie jest już dostępny może być przydatny do przekazania szybkiej wiadomości również do wyświetlenia, które znikną po pierwszym przeczytaniu. ViewBag Jego bardziej użyteczne przy przekazywaniu szybko kawałek danych do widoku, zwykle należy przekazać wszystkie dane do widoku przez model, ale są przypadki, gdy model pochodzi bezpośrednio z klasy, która jest map do bazy danych, takich jak entity framework w takim razie nie wiesz, co zmienić model, aby przekazać nowy kawałek danych, możesz wsadzić to do worka widokowego ViewData jest tylko zindeksowaną wersją ViewBag i była używana przed MVC3

 0
Author: David Fawzy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-28 18:04:28

Również zakres jest inny między viewbag i temptdata. viewbag opiera się na pierwszym widoku (nie współdzielonym między metodami akcji), ale temptdata może być współdzielona między metodą akcji a tylko jedną.

 0
Author: Elnaz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-16 12:26:31