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. Это потому, что внутри он использует Сессию, и я отключаю сессию в своих приложениях. Я предпочитаю более RESTful способ достичь этого. Что: в первом действии контроллера, которое выполняет перенаправление, сохраните объект в вашем хранилище данных и используйте сгенерированный уникальный идентификатор при перенаправлении. Затем на целевом действии используйте этот идентификатор для извлечения первоначально сохраненного объекта:
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);
}
}
Представление остается тем же.