ViewBag, ViewData e TempData

Poderia algum corpo explicar, quando usar

  1. TempData
  2. ViewBag
  3. Ver dados

Eu tenho um requisito, onde eu preciso definir um valor em um controlador, esse controlador irá redirect para o controlador dois e o controlador dois renderizará o modo de exibição.

Eu tentei usar o ViewBag, o valor se perde no momento em que eu alcanço o Controlador Dois.

Posso saber quando usar e vantagens ou desvantagens?

obrigado

1) TempData

Permite que você armazene dados que sobreviverão para um redirecionamento. Internamente, ele usa a Session como uma loja de panificação, é só que depois que o redirecionamento é feito, os dados são automaticamente despejados. O padrão é o seguinte:

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

Permite armazenar dados em uma ação do controlador que será usada na visualização correspondente. Isso pressupõe que a ação retorna uma visão e não redireciona. Vive apenas durante o pedido atual.

O padrão é o seguinte:

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

e na visão:

 @ViewBag.Foo 

ou com ViewData:

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

e na visão:

 @ViewData["Foo"] 

ViewBag é apenas um wrapper dynamic em torno do ViewData e existe apenas no ASP.NET MVC 3.

Dito isto, nenhuma dessas duas construções deve ser usada. Você deve usar modelos de visualização e modos de exibição fortemente tipados. Portanto, o padrão correto é o seguinte:

Modelo de exibição:

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

Açao:

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

Visão fortemente tipada:

 @model MyViewModel @Model.Foo 

Após esta breve introdução, vamos responder sua pergunta:

Minha exigência é que eu queira definir um valor em um controlador, esse controlador irá redirect para ControllerTwo e Controller2 renderizará a View.

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

e a visão correspondente ( ~/Views/Two/Index.cshtml ):

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

Há desvantagens de usar TempData também: se o usuário atingir F5 na página de destino, os dados serão perdidos.

Pessoalmente eu não uso TempData nem. É porque internamente ele usa Session e eu desabilito a session em meus aplicativos. Eu prefiro uma maneira mais RESTful de conseguir isso. Qual é: na primeira ação do controlador que executa o redirecionamento, armazene o object em seu armazenamento de dados e use o ID exclusivo gerado ao redirect. Em seguida, na ação de destino, use esse id para recuperar o object armazenado inicialmente:

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

A visão permanece a mesma.

A ASP.NET MVC nos oferece três opções ViewData, ViewBag e TempData para passar dados do controlador para visualizar e na próxima requisição. ViewData e ViewBag são quase similares e TempData executa responsabilidade adicional. Vamos discutir ou obter pontos-chave nesses três objects:

Semelhanças entre ViewBag e ViewData:

  • Ajuda a manter os dados quando você passa do controlador para a visualização.
  • Usado para transmitir dados do controlador para a visualização correspondente.
  • Vida curta significa que o valor se torna nulo quando o redirecionamento ocorre. Isso ocorre porque o objective deles é fornecer uma maneira de se comunicar entre controladores e visualizações. É um mecanismo de comunicação dentro da chamada do servidor.

Diferença entre ViewBag e ViewData:

  • ViewData é um dictionary de objects que é derivado da class ViewDataDictionary e acessível usando strings como chaves.
  • ViewBag é uma propriedade dinâmica que aproveita os novos resources dynamics no C # 4.0.
  • ViewData requer typecasting para tipos de dados complexos e verifica valores nulos para evitar erros.
  • O ViewBag não requer typecasting para tipos de dados complexos.

ViewBag & ViewData Exemplo:

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

Em vista:

 @ViewBag.Name @ViewData["Name"] 

TempData:

TempData também é um dictionary derivado da class TempDataDictionary e armazenado na session de curtas vidas e é uma chave de string e um valor de object. A diferença é que o ciclo de vida do object. TempData mantém as informações pelo tempo de uma solicitação HTTP. Isso significa apenas de uma página para outra. Isso também funciona com um redirecionamento 302/303 porque está na mesma solicitação HTTP. Ajuda a manter os dados quando você passa de um controlador para outro controlador ou de uma ação para outra ação. Em outras palavras, quando você redireciona, “TempData” ajuda a manter os dados entre esses redirecionamentos. Usa internamente variables ​​de session. O uso de dados temporários durante a solicitação atual e subsequente significa apenas que é usado quando você tem certeza de que a próxima solicitação será redirecionada para a próxima visualização. Ela exige typecasting para tipos de dados complexos e verifica valores nulos para evitar erros. Geralmente usado para armazenar apenas uma vez mensagens como mensagens de erro, mensagens de validação.

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

O último mecanismo é a Session que funciona como o ViewData, como um Dictionary que pega uma string por key e object for value. Este é armazenado no cookie do cliente e pode ser usado por muito mais tempo. Também precisa de mais verificação para nunca ter informações confidenciais. Em relação ao ViewData ou ViewBag, você deve usá-lo de maneira inteligente para o desempenho do aplicativo. Porque cada ação passa por todo o ciclo de vida do pedido asp.net mvc regular. Você pode usar ViewData / ViewBag em sua ação filho, mas tenha cuidado para não usá-lo para preencher os dados não relacionados que podem poluir seu controlador.

TempData

Basicamente é como um DataReader, uma vez lidos, os dados serão perdidos.

Confira este vídeo

Exemplo

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

Se você prestar atenção ao código acima, RedirectToAction não terá nenhum impacto sobre o TempData até que TempData seja lido. Então, uma vez que TempData é lido, os valores serão perdidos.

Como posso manter o TempData depois de ler?

Verifique a saída no teste 1 do método de ação e no teste 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(); } } 

Se você prestar atenção ao código acima, os dados não serão perdidos após RedirectToAction, assim como após a leitura dos dados, e o motivo é que estamos usando TempData.Keep() . é aquele

Desta forma, você pode fazê-lo persistir, desde que você deseja em outros controladores também.

ViewBag / ViewData

Os dados persistirão na visualização correspondente

TempData em Asp.Net MVC é um recurso muito útil. Ele é usado para passar dados da solicitação atual para a solicitação subsequente. Em outras palavras, se quisermos enviar dados de uma página para outra enquanto o redirecionamento ocorre, podemos usar TempData, mas precisamos fazer alguma consideração no código para obter esse recurso no MVC. Porque a vida de TempData é muito curta e fica apenas até que a exibição de destino esteja totalmente carregada. Mas, podemos usar o método Keep () para persistir os dados no TempData.

consulte Mais informação

ViewBag, ViewData, TempData e View State no MVC

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

A ASP.NET MVC nos oferece três opções ViewData, VieBag e TempData para passar dados do controlador para visualizar e na próxima requisição. ViewData e ViewBag são quase similares e TempData executa responsabilidade adicional.

Semelhanças entre ViewBag e ViewData:

Ajuda a manter os dados quando você passa do controlador para a visualização. Usado para transmitir dados do controlador para a visualização correspondente. Vida curta significa que o valor se torna nulo quando o redirecionamento ocorre. Isso ocorre porque o objective deles é fornecer uma maneira de se comunicar entre controladores e visualizações. É um mecanismo de comunicação dentro da chamada do servidor.

Diferença entre ViewBag e ViewData:

ViewData é um dictionary de objects que é derivado da class ViewDataDictionary e acessível usando strings como chaves. ViewBag é uma propriedade dinâmica que aproveita os novos resources dynamics no C # 4.0. ViewData requer typecasting para tipos de dados complexos e verifica valores nulos para evitar erros. O ViewBag não requer typecasting para tipos de dados complexos.

ViewBag & ViewData Exemplo:

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

Em View, chamamos como abaixo:

 @ViewBag.Name @ViewData["Name"] 

TempData:

Ajuda a manter os dados quando você passa de um controlador para outro controlador ou de uma ação para outra ação. Em outras palavras, quando você redireciona, “Tempdata” ajuda a manter os dados entre esses redirecionamentos. Usa internamente variables ​​de session. TempData deve ser uma instância de duração muito curta, e você deve usá-la somente durante as solicitações atuais e subsequentes apenas

O único cenário em que usar TempData funcionará de forma confiável é quando você está redirecionando. Isso ocorre porque um redirecionamento mata a solicitação atual (e envia o código de status HTTP 302 Objeto movido para o cliente) e cria uma nova solicitação no servidor para veicular a exibição redirecionada.

Ela exige typecasting para tipos de dados complexos e verifica valores nulos para evitar erros.

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

TempData estará sempre disponível até a primeira leitura, uma vez que você lê o seu não está disponível mais pode ser útil para passar mensagem rápida também para ver que será ido após a primeira leitura. ViewBag É mais útil ao passar rapidamente um pedaço de dados para a view, normalmente você deve passar todos os dados para a view através do model, mas há casos em que modelamos vindo diretamente da class que é map no database como entity framework nesse caso o que mudar seu modelo para passar um novo pedaço de dados, você pode colocar isso na viewbag ViewData é apenas uma versão indexada do ViewBag e foi usado antes do MVC3

Além disso, o escopo é diferente entre viewbag e temptdata. O viewbag é baseado na primeira exibição (não compartilhada entre os methods de ação), mas os dados do tipo tempt podem ser compartilhados entre um método de ação e apenas um ao outro.