Diferença entre ViewData e TempData?

94

Eu sei o que é ViewData e o uso o tempo todo, mas no ASP.NET Preview 5 eles introduziram algo novo chamado TempData.

Eu normalmente digito fortemente meu ViewData, em vez de usar a abordagem de dicionário de objetos.

Então, quando devo usar TempData em vez de ViewData?

Existem práticas recomendadas para isso?

Elijah Manor
fonte
Gostaria de acrescentar algo sobre TempDataaqui stackoverflow.com/a/17199709/2015869
Imad Alazani

Respostas:

94

Em uma frase: TempDatasão como ViewData com uma diferença: Eles só contêm dados entre duas solicitações sucessivas, depois disso são destruídos. Você pode usar TempDatapara passar mensagens de erro ou algo semelhante.

Embora desatualizado, este artigo tem uma boa descrição do TempDataciclo de vida.

Como Ben Scheirman disse aqui :

TempData é um dicionário de armazenamento temporário apoiado por sessão que está disponível para uma única solicitação. É ótimo passar mensagens entre controladores.

Dragan Panjkov
fonte
Eu acho que é uma grande diferença, pois TempDataenvolverá algo potencialmente muito mais complicado (a sessão) do que um simples dicionário sendo passado de método para método
Matti Virkkunen
29

Quando uma ação retorna um resultado RedirectToAction, ela causa um redirecionamento HTTP (equivalente a Response.Redirect). Os dados podem ser preservados na propriedade TempData (dicionário) do controlador durante uma única solicitação de redirecionamento HTTP.

Capitão Sensível
fonte
O valor de ViewData será preservado no mesmo caso?
IsmailS
9
@Ismail: Não, ViewData não preservará os dados por meio do Redirect. Essa é a principal diferença do TempData.
Mariano Desanze
5

Ver dados:

  • ViewData é um tipo de dicionário public ViewDataDictionary ViewData { get; set; }
  • Ele pode ser usado para passar dados do controlador para a visualização, apenas de uma maneira
  • É a vida encontra-se apenas durante o pedido atual
  • Se for passar string, não há necessidade de digitar
  • Se estiver passando o objeto, você precisa fazer o typecast, mas antes disso você precisa verificar se ele não é nulo
  • É uma propriedade on ControllerBase, que é o pai da Controllerclasse

TempData:

  1. TempDatause internamente TempDataDictionary:public TempDataDictionary TempData { get; set; }
  2. Depois que os dados são salvos no TempDataDictionaryobjeto:
    • Ele persiste nele e pode ser lido a partir de qualquer visão ou ação em qualquer controlador
    • Só pode ser lido uma vez; uma vez lido, torna-se nulo
    • Ele é salvo na sessão, portanto, na expiração da sessão, os dados são perdidos.

Este comportamento é novo na ASP.NET MVC 2 e nas versões posteriores. Em versões anteriores da ASP.NET MVC, os valores em TempDataestavam disponíveis apenas até a próxima solicitação.

  1. Ele está ativo, até que seja lido ou a sessão expire e pode ser lido de qualquer lugar.

Veja a comparação de ViewData, ViewBag, TempData e Session em MVC em detalhes

Ali Adravi
fonte
0

view data é usado quando queremos passar dados do controlador para a view correspondente. os dados de exibição têm vida muito curta, o que significa que serão destruídos quando ocorrer o redirecionamento. Exemplo (controlador):

public ViewResult try1()
    {
        ViewData["DateTime"] = DateTime.Now;
        ViewData["Name"] = "Mehta Hitanshi";
        ViewData["Twitter"] = "@hitanshi";
        ViewData["City"] = "surat";
        return View();
    }

try1.cshtm

<table>
<tr>
    <th>Name</th>
    <th>Twitter</th>
    <th>Email</th>
    <th>City</th>
    <th>Mobile</th>
</tr>
<tr>
    <td>@ViewData["Name"]</td>
    <td>@ViewData["Twitter"]</td>
    <td>@ViewData["City"]</td>
</tr>
</table> 

TempData transfere os dados entre controladores ou entre ações. Ele é usado para armazenar mensagens únicas e sua vida é muito curta. Podemos usar TempData.Keep () para torná-lo disponível por meio de todas as ações ou para torná-lo persistente.

Exemplo (controlador):

public ActionResult try3()
    {
        TempData["DateTime"] = DateTime.Now;
        TempData["Name"] = "Ravina";
        TempData["Twitter"] = "@silentRavina";
        TempData["Email"] = "[email protected]";
        TempData["City"] = "India";
        TempData["MobNo"] = 9998975436;
        return RedirectToAction("TempView1");
    }
    public ActionResult TempView1()
    {
        return View();
    }

TempView1.cshtm

<table>
<tr>
    <th>Name</th>
    <th>Twitter</th>
    <th>Email</th>
    <th>City</th>
    <th>Mobile</th>
</tr>
<tr>
    <td>@TempData["Name"]</td>
    <td>@TempData["Twitter"]</td>
    <td>@TempData["Email"]</td>
    <td>@TempData["City"]</td>
    <td>@TempData["MobNo"]</td>
</tr>
</table>
Hitanshi Mehta
fonte