2013-03-04 23 views
10

ViewData i ViewBag umożliwiają dostęp do dowolnych danych w widoku przekazanym z kontrolera.ViewBag, ViewData, TempData, Session - jak i kiedy z nich korzystać?

Główna różnica między tymi dwoma rodzajami to sposób uzyskiwania dostępu do danych. W ViewBag uzyskujesz dostęp do danych za pomocą ciągu znaków jako klawiszy - ViewBag ["numbers"] W ViewData uzyskujesz dostęp do danych przy użyciu właściwości - ViewData.numbers.

ViewData przykład

STEROWNIK

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

      ViewData["numbers"] = Numbers; 

WIDOK

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

</ul> 

ViewBag przykład

STEROWNIK

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

     ViewBag.numbers = Numbers; 

WIDOK

<ul> 

@foreach (var number in ViewBag.numbers) 

{ 
<li>@number</li> 
} 

</ul> 

Sesja to kolejny bardzo przydatny przedmiot, który będzie posiadał żadnych informacji.

Na przykład, gdy użytkownik zalogował się do systemu, który chce zachować swój poziom autoryzacji.

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

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

Te informacje będą przechowywane w sesji jak długo sesji użytkownika jest aktywne. Można to zmienić w pliku Web.config:

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

Więc kontroler wewnątrz działania:

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

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

     return View("AccessDenied"); 
    } 

TempData jest bardzo podobny do ViewData i ViewBag jednak będzie on zawierał dane tylko dla jedna prośba.

KONTROLER

// Ty stworzył metodę, aby dodać nowego klienta.

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

WIDOK

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

TempData jest przydatna, gdy chcesz przekazać pewne informacje z widoku do kontrolera. Na przykład chcesz zatrzymać czas, kiedy żądanie zostało wyświetlone.

WIDOK

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

KONTROLER

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

Dzięki za więcej informacji na ten temat! To powinno być naprawdę pomocne dla większości ludzi. –

+0

Czy jest tu pytanie lub czy jest to wpis na blogu? W porządku jest odpowiedzieć na własne pytanie, ale należy to zrobić jako odpowiedź, a nie jako część pytania. Co ważniejsze, materiał ten był już wcześniej omawiany, na przykład [Jaki jest odpowiedni czas dla ViewData, ViewBag, Session, TempData] (http://stackoverflow.com/questions/12676924/what-is-the-right-time -for-viewdata-viewbag-session-tempdata) –

+0

Zapamiętam to na przyszłość i przepraszam za to. Próbowałem podać więcej przykładów, a może bardziej doświadczeni programiści również dzielą się swoimi doświadczeniami. –

Odpowiedz

11

ViewBag, ViewData, TempData, Sesja - jak i kiedy je stosować?

ViewBag

uniknąć. Jeśli możesz, użyj modelu widoku.

Powodem jest to, że podczas korzystania z właściwości dynamicznych nie otrzymasz błędów kompilacji. Zmiana nazwy właściwości przez przypadek lub cel jest łatwa, a następnie zapomnij zaktualizować wszystkie zastosowania.

Jeśli korzystasz z ViewModel, nie będziesz mieć tego problemu. Model widoku przenosi także odpowiedzialność za dostosowanie "M" (tj. Podmiotów gospodarczych) w MVC ze sterownika i widoku do ViewModel, dzięki czemu otrzymuje się czystszy kod z wyraźnymi obowiązkami.

Action

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

View (składnia brzytwa)

@ViewBag.SomeProperty 

ViewData

Avoit to.Jeśli możesz, użyj modelu widoku. Taki sam powód jak w przypadku ViewBag.

Action

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

View (razor składnia):

@ViewData["SomeProperty"] 

dane Temp

wszystko, co można przechowywać w TempData pozostanie w TempData aż ją przeczytać, bez względu na to, czy pomiędzy nimi występuje jedno lub kilka żądań HTTP.

Działania

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


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

"Kiedy trzeba zachować informacje w kilku żądaniach" - myślę, że TempData jest dobry tylko do czasu odczytu. Myślę, że użycie kilku wniosków tutaj jest trochę mylące. – Tommy

+1

Mam na myśli to, że pozostaje on w danych tymczasowych, dopóki go nie przeczytasz, bez względu na to, czy są to dwie prośby, czy dziesięć. Ale rozumiem, o co chodzi i rozwinie się. – jgauffin

+0

+1 dla ViewBag - unikaj tego. –

3

TempData

ma być instancją bardzo krótkotrwały i należy go używać tylko podczas bieżącej i tylko kolejne prośby! Ponieważ TempData działa w ten sposób, musisz wiedzieć na pewno, jakie będzie następne żądanie, a przekierowanie do innego jest jedynym czasem, kiedy możesz to zagwarantować. Dlatego jedynym scenariuszem, w którym użycie TempData będzie działać niezawodnie, jest przekierowanie. Dzieje się tak dlatego, że przekierowanie zabija bieżące żądanie (i wysyła kod stanu HTTP 302 Obiekt przeniesiony do klienta), a następnie tworzy nowe żądanie na serwerze w celu obsługi przekierowanego widoku. Patrząc wstecz na poprzedni przykładowy kod programu HomeController oznacza, że ​​obiekt TempData może przynieść wyniki inaczej niż oczekiwano, ponieważ nie można zagwarantować, że następne żądanie nie zostanie spełnione. Na przykład następne żądanie może pochodzić z zupełnie innej maszyny i instancji przeglądarki.

ViewData

ViewData jest słownikiem obiekt, który można umieścić na dane, które następnie staje się dostępny do widoku. ViewData jest pochodną klasy ViewDataDictionary, dzięki czemu można uzyskać dostęp za pomocą znanej składni "klucz/wartość".

ViewBag

Przedmiotem ViewBag jest owinięcie wokół obiektu ViewData, które pozwala na tworzenie dynamicznych właściwości dla ViewBag.

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

}

W powyższej rozmowy, niewiele mylić dla każdego. jeśli spojrzysz na mój powyższy kod, tempdata jest jak koncepcja viewdata, ale wtedy jest w stanie przekierować również inny widok. to jest pierwsza kwestia.

drugi punkt: kilka z nich twierdzi, że zachowuje wartość do przeczytania, a kilka z nich zadaje pytanie, czy będzie to oznaczać tylko czas? bynajmniej. Właściwie można przeczytać dowolną ilość czasu w kodzie w jednym pakiecie po renderowaniu strony. gdy wystąpi renderowanie strony, jeśli zrobisz to ponownie, postpack (request) oznacza, że ​​wartość tempdata staje się NULL.

nawet ty prosisz o tyle czasu, ale wartość tempdata wciąż żyje -> w tym przypadku twój numer żądania nie powinien odczytać wartości danych tymczasowych.

Powiązane problemy