1) TempData
Le permite almacenar datos que sobrevivirán para una redirección. Internamente utiliza la sesión como almacén de respaldo, después de que se realiza la redirección, los datos se expulsan automáticamente. El patrón es el siguiente:
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
Le permite almacenar datos en una acción del controlador que se utilizará en la vista correspondiente. Esto supone que la acción devuelve una vista y no redirige. Vive solo durante la solicitud actual.
El patrón es el siguiente:
public ActionResult Foo()
{
ViewBag.Foo = "bar";
return View();
}
y en la vista:
@ViewBag.Foo
o con ViewData:
public ActionResult Foo()
{
ViewData["Foo"] = "bar";
return View();
}
y en la vista:
@ViewData["Foo"]
ViewBag
es solo un contenedor dinámico ViewData
y existe solo en ASP.NET MVC 3.
Dicho esto, ninguna de esas dos construcciones debe usarse nunca. Debe usar modelos de vista y vistas fuertemente tipadas. Entonces el patrón correcto es el siguiente:
Ver modelo:
public class MyViewModel
{
public string Foo { get; set; }
}
Acción:
public Action Foo()
{
var model = new MyViewModel { Foo = "bar" };
return View(model);
}
Vista fuertemente tipada:
@model MyViewModel
@Model.Foo
Después de esta breve introducción, respondamos su pregunta:
Mi requisito es que quiero establecer un valor en un controlador, ese controlador redirigirá a ControllerTwo y Controller2 representará 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);
}
}
y la vista correspondiente ( ~/Views/Two/Index.cshtml
):
@model MyViewModel
@Html.DisplayFor(x => x.Foo)
También hay inconvenientes en el uso de TempData: si el usuario alcanza F5 en la página de destino, los datos se perderán.
Personalmente, tampoco uso TempData. Es porque internamente usa Session y desactivo la sesión en mis aplicaciones. Prefiero una forma más RESTANTE para lograr esto. Que es: en la primera acción del controlador que realiza la redirección, almacene el objeto en su almacén de datos y use la identificación única generada al redirigir. Luego, en la acción de destino, use esta identificación para recuperar el objeto almacenado 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);
}
}
La vista se mantiene igual.