1) TempData
Consente di archiviare i dati che sopravviveranno per un reindirizzamento. Internamente utilizza la Sessione come archivio di backup, dopo aver effettuato il reindirizzamento i dati vengono automaticamente sfrattati. Il modello è il seguente:
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
Consente di archiviare i dati in un'azione del controller che verrà utilizzata nella vista corrispondente. Ciò presuppone che l'azione restituisca una vista e non reindirizzi. Vive solo durante la richiesta corrente.
Il modello è il seguente:
public ActionResult Foo()
{
ViewBag.Foo = "bar";
return View();
}
e nella vista:
@ViewBag.Foo
o con ViewData:
public ActionResult Foo()
{
ViewData["Foo"] = "bar";
return View();
}
e nella vista:
@ViewData["Foo"]
ViewBag
è solo un wrapper dinamico ViewData
ed esiste solo in ASP.NET MVC 3.
Detto questo, nessuno di questi due costrutti dovrebbe mai essere usato. È necessario utilizzare modelli di visualizzazione e visualizzazioni fortemente tipizzate. Quindi il modello corretto è il seguente:
Vedi modello:
public class MyViewModel
{
public string Foo { get; set; }
}
Azione:
public Action Foo()
{
var model = new MyViewModel { Foo = "bar" };
return View(model);
}
Vista fortemente tipizzata:
@model MyViewModel
@Model.Foo
Dopo questa breve introduzione rispondiamo alla tua domanda:
Il mio requisito è che voglio impostare un valore in un controller, quel controller reindirizzerà su ControllerTwo e Controller2 visualizzerà la vista.
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 la vista corrispondente ( ~/Views/Two/Index.cshtml
):
@model MyViewModel
@Html.DisplayFor(x => x.Foo)
Ci sono anche degli svantaggi nell'utilizzo di TempData: se l'utente preme F5 sulla pagina di destinazione, i dati andranno persi.
Personalmente non uso nemmeno TempData. È perché internamente utilizza Session e disabilito la sessione nelle mie applicazioni. Preferisco un modo più RESTful per raggiungere questo obiettivo. Che è: nella prima azione del controller che esegue l'archivio di reindirizzamento l'oggetto nell'archivio dati e l'utente l'id univoco generato durante il reindirizzamento. Quindi sull'azione di destinazione utilizzare questo ID per recuperare l'oggetto inizialmente memorizzato:
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);
}
}
La vista rimane la stessa.