Я редактировал проект, и я видел Session [ "] в одном методе контроллера и TempData [" "] в другом. Есть ли разница между 4 или это всего лишь 4 способа сделать то же самое.
Какое время для ViewData, ViewBag, Session, TempData
Ответ 1
- ViewData/ViewBag - действителен только для продолжительности текущего запроса.
Вы устанавливаете его в действие контроллера и используете его в представлении, а затем исчезаете.
Разница в том, что первый словарь, тогда как второй - это всего лишьdynamic
обертка вокруг этого словаря.
Оба указывают на одни и те же данные.
ViewBag был представлен в ASP.NET MVC 3.
Пример:
public ActionResult Index()
{
ViewData["foo"] = "bar";
return View();
}
и внутри представления вы можете использовать это значение:
<div>@ViewData["foo"]</div>
То же самое с ViewBag, но динамическое:
public ActionResult Index()
{
ViewBag.foo = "bar";
return View();
}
и внутри представления вы можете использовать это значение:
<div>@ViewBag.foo</div>
Так как вы можете видеть, что ViewData/ViewBag - это просто альтернативный способ передачи информации в представление из действия контроллера по сравнению с классическим и рекомендованным способом, использующим модель представления:
public class MyViewModel
{
public string Foo { get; set; }
}
а затем:
public ActionResult Index()
{
var model = new MyViewModel { Foo = "bar" };
return View(model);
}
и внутри вашего строго типизированного представления:
@model MyViewModel
<div>@Html.DisplayFor(x => x.Foo)</div>
Как вы можете видеть, использование моделей просмотра обеспечивает строго типизированный подход при передаче информации в представление из действия контроллера.
- TempDatastrong > - он позволяет сохранять текущую информацию в течение одного последующего запроса. Вы храните что-то внутри TempData и затем перенаправляете. В действии целевого контроллера, к которому вы перенаправили, вы можете получить значение, которое было сохранено в TempData.
Пример:
public ActionResult Foo()
{
TempData["foo"] = "bar";
return RedirectToAction("bar");
}
public ActionResult Bar()
{
var value = TempData["foo"] as string;
// use the value here. If you need to pass it to the view you could
// use ViewData/ViewBag (I can't believe I said that but I will leave it for the moment)
return View();
}
ASP.NET MVC автоматически истекает значение, которое было сохранено в TempData
после его чтения. Под обложками ASP.NET MVC сохраняет информацию в Session
.
- Сеанс - тот же, что и TempData, за исключением того, что он никогда не истекает - он будет действителен для всех запросов, а не для одного перенаправления.
Ответ 2
ASP.net MVC представил ViewData, ViewBag, TempData, Session для передачи данных между контроллером для просмотра.
ViewDataSTRONG >
ViewData реализуется с помощью класса ViewDataDictionary, который хранится в CurrentRequestContext. Таким образом, жизненный цикл ViewData завершится, когда заканчивается текущий запрос.
ViewBag также похож на ViewData, и только различие заключается в том, что он позволяет динамически совместно использовать данные с помощью объектов динамической области.
TempDatastrong > - это очень короткоживущий экземпляр, и вы должны использовать его только во время текущих и последующих запросов. Это будет быть удобными, если вы хотите использовать перенаправления (RedirectToAction, RedirectToRoute, Redirect) в ASP.net MVC и передавать некоторые данные среди перенаправлений. TempData хранит данные в сеансе, но структура удаляет данные, когда текущие и последующие запросы заканчиваются.
Сеанс является долговременным (никогда не истекает) данными, принадлежащими пользовательскому сеансу. Необходимо помнить, когда вы используете переменные сеанса, которые могут быть легко вызваны проблемами.
protected void Session_Start(Object sender, EventArgs e)
{
int userType = 1;
HttpContext.Current.Session.Add("_SessionUserType",userType );
}
Ответ 3
ViewData:
- Является специальным словарем, унаследованным от
ViewDataDictionary
. - Используется для отправки данных с контроллера для просмотра.
- Срок службы - текущий запрос.
- Он будет уничтожен, если у вас есть
Redirect
. - По соображениям безопасности лучше проверить его на
null
перед использованием. - Кастинг должен выполняться для операции.
ViewBag:
-
Является динамическим типом (этот тип представлен в С# 4).
-
Подобно
ViewData
используется для отправки данных с контроллера в представление. - Продолжительность действия своих значений в текущем запросе.
- При перенаправлении между страницами его значение будет равно null.
- Из соображений безопасности перед использованием проверьте его на
null
. - Кастинг не нужен, поэтому он быстрее, чем
ViewData
.
TempData:
- Специальный тип словаря, полученного из
TempDataDictionary
. - Он имеет Короткое время жизни и используется для отправки информации между страницами (
Redirect
). - После полного рендеринга
View
его значение будетnull
. - Из соображений безопасности перед использованием проверьте его на
null
. - Кастинг должен выполняться для операции.
Сеанс:
- Используется для отправки информации между различными запросами.
- Его значение не
null
не нулевые значения; Если через определенное время (session expire
). - Из соображений безопасности перед использованием проверьте его на
null
. - Кастинг должен выполняться для операции.