1) TempData
Дозволяє зберігати дані, які збережуться для переадресації. Внутрішньо він використовує сеанс як резервне зберігання, після перенаправлення дані автоматично вилучаються. Схема наступна:
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
Дозволяє зберігати дані в дії контролера, які будуть використані у відповідному вікні. Це передбачає, що дія повертає перегляд і не перенаправляє. Живе лише під час поточного запиту.
Схема наступна:
public ActionResult Foo()
{
ViewBag.Foo = "bar";
return View();
}
і в перегляді:
@ViewBag.Foo
або з ViewData:
public ActionResult Foo()
{
ViewData["Foo"] = "bar";
return View();
}
і в перегляді:
@ViewData["Foo"]
ViewBag
є просто динамічною обгорткою навколо ViewData
і існує лише в ASP.NET MVC 3.
Як було сказано, жодна з цих двох конструкцій ніколи не повинна використовуватися. Слід використовувати моделі перегляду та сильно набрані види. Тож правильний зразок такий:
Переглянути модель:
public class MyViewModel
{
public string Foo { get; set; }
}
Дія:
public Action Foo()
{
var model = new MyViewModel { Foo = "bar" };
return View(model);
}
Сильно набраний вид:
@model MyViewModel
@Model.Foo
Після цього короткого вступу давайте відповімо на ваше запитання:
Моя вимога полягає в тому, що я хочу встановити значення в контролері, яке контролер перенаправить на ControllerTwo, а Controller2 візуалізує перегляд.
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);
}
}
і відповідний вид ( ~/Views/Two/Index.cshtml
):
@model MyViewModel
@Html.DisplayFor(x => x.Foo)
Існують і недоліки використання TempData: якщо користувач потрапить на F5 на цільовій сторінці, дані будуть втрачені.
Особисто я також не використовую TempData. Це тому, що внутрішньо він використовує сесію, і я відключаю сеанс у своїх програмах. Я віддаю перевагу більш РЕАЛЬНИЙ спосіб досягти цього. Що полягає: у першій дії контролера, який виконує переадресацію, зберігається об’єкт у вашому сховищі даних та користувачеві створюється унікальний ідентифікатор під час перенаправлення. Потім в цільовій дії використовуйте цей ідентифікатор, щоб отримати спочатку збережений об'єкт:
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);
}
}
Вид залишається однаковим.