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);
}
}
Представление остается тем же.