1) TempData
Ermöglicht das Speichern von Daten, die für eine Umleitung überleben. Intern wird die Sitzung als Sicherungsspeicher verwendet. Nach der Umleitung werden die Daten automatisch entfernt. Das Muster ist das folgende:
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
Ermöglicht das Speichern von Daten in einer Controller-Aktion, die in der entsprechenden Ansicht verwendet wird. Dies setzt voraus, dass die Aktion eine Ansicht zurückgibt und nicht umleitet. Lebt nur während der aktuellen Anfrage.
Das Muster ist das folgende:
public ActionResult Foo()
{
ViewBag.Foo = "bar";
return View();
}
und in der Ansicht:
@ViewBag.Foo
oder mit ViewData:
public ActionResult Foo()
{
ViewData["Foo"] = "bar";
return View();
}
und in der Ansicht:
@ViewData["Foo"]
ViewBag
ist nur ein dynamischer Wrapper ViewData
und existiert nur in ASP.NET MVC 3.
Abgesehen davon sollte keines dieser beiden Konstrukte jemals verwendet werden. Sie sollten Ansichtsmodelle und stark typisierte Ansichten verwenden. Das richtige Muster lautet also wie folgt:
Modell anzeigen:
public class MyViewModel
{
public string Foo { get; set; }
}
Aktion:
public Action Foo()
{
var model = new MyViewModel { Foo = "bar" };
return View(model);
}
Stark getippte Ansicht:
@model MyViewModel
@Model.Foo
Nach dieser kurzen Einführung beantworten wir Ihre Frage:
Meine Anforderung ist, dass ich einen Wert in einem Controller festlegen möchte. Dieser Controller leitet zu ControllerTwo um und Controller2 rendert die Ansicht.
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);
}
}
und die entsprechende Ansicht ( ~/Views/Two/Index.cshtml
):
@model MyViewModel
@Html.DisplayFor(x => x.Foo)
Die Verwendung von TempData hat auch Nachteile: Wenn der Benutzer auf der Zielseite F5 drückt, gehen die Daten verloren.
Persönlich benutze ich TempData auch nicht. Dies liegt daran, dass intern die Sitzung verwendet wird und ich die Sitzung in meinen Anwendungen deaktiviere. Ich bevorzuge einen ruhigeren Weg, um dies zu erreichen. Das heißt: In der ersten Controller-Aktion, die die Umleitung ausführt, speichern Sie das Objekt in Ihrem Datenspeicher und verwenden Sie die generierte eindeutige ID beim Umleiten. Verwenden Sie dann für die Zielaktion diese ID, um das ursprünglich gespeicherte Objekt zurückzurufen:
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);
}
}
Die Ansicht bleibt gleich.