ViewBag, ViewData, TempData, Session - как и когда их использовать?

ViewData и ViewBag позволяют получить доступ к любым данным, которые были переданы с контроллера.

Основное различие между этими двумя - это то, как вы обращаетесь к данным. В ViewBag вы получаете доступ к данным с помощью строки в виде ключей - ViewBag [ "numbers" ] В ViewData вы получаете доступ к данным с помощью свойств - ViewData.numbers.

Пример ViewData​​strong >

КОНТРОЛЛЕР

 var Numbers = new List<int> { 1, 2, 3 };

          ViewData["numbers"] = Numbers;

VIEW

<ul>
 @foreach (var number in (List<int>)ViewData["numbers"])
 {
     <li>@number</li> 
 }

 </ul>

ViewBag пример

КОНТРОЛЛЕР

 var Numbers = new List<int> { 1, 2, 3 };

         ViewBag.numbers = Numbers;

VIEW

<ul>

@foreach (var number in ViewBag.numbers)

{
<li>@number</li> 
}

</ul>

Сессия - еще один очень полезный объект, который будет содержать любую информацию.

Например, когда пользователь вошел в систему, вы хотите сохранить его уровень авторизации.

// GetUserAuthorizationLevel - some method that returns int value for user authorization level.

Session["AuthorizationLevel"] = GetUserAuthorizationLevel(userID);

Эта информация будет сохранена в сеансе, пока активен сеанс пользователя. Это можно изменить в файле Web.config:

<system.web>
    <sessionState mode="InProc" timeout="30"/>

Итак, тогда в контроллере внутри действия:

 public ActionResult LevelAccess()
     {
         if (Session["AuthorizationLevel"].Equals(1))
         {
             return View("Level1");
         }

        if (Session["AuthorizationLevel"].Equals(2))
        {
            return View("Level2");
        }

        return View("AccessDenied");
    }

TempData​​strong > очень похож на ViewData и ViewBag, однако он будет содержать данные только для одного запроса.

КОНТРОЛЛЕР

//Создан метод добавления нового клиента.

TempData["ClientAdded"] = "Client has been added";

VIEW

@if (TempData["ClientAdded"] != null)
{ 
   <h3>@TempData["ClientAdded"] </h3>
}

TempData полезен, когда вы хотите передать некоторую информацию из View в Controller. Например, вы хотите сохранить время, когда запрос был запрошен.

VIEW

@{
TempData["DateOfViewWasAccessed"] = DateTime.Now;
}

КОНТРОЛЛЕР

if (TempData["DateOfViewWasAccessed"] != null)
   {
    DateTime time = DateTime.Parse(TempData["DateOfViewWasAccessed"].ToString()); 
   }

Ответ 1

ViewBag, ViewData, TempData, Session - как и когда их использовать?

ViewBag

Избегайте этого. Используйте модель просмотра, когда сможете.

Причина в том, что при использовании динамических свойств вы не получите ошибок компиляции. Очень легко изменить имя свойства случайно или по назначению, а затем забыть обновить все способы использования.

Если вы используете ViewModel, у вас не будет этой проблемы. Модель просмотра также берет на себя ответственность за адаптацию "M" (то есть бизнес-сущностей) в MVC от контроллера и представление к ViewModel, таким образом вы получаете более чистый код с четкими обязанностями.

Действие

public ActionResult Index()
{
    ViewBag.SomeProperty = "Hello";
    return View();
}

Просмотр (синтаксис бритвы)

@ViewBag.SomeProperty

ViewData​​h1 >

Извлеките его. Используйте модель просмотра, когда сможете. Та же причина, что и для ViewBag.

Действие

public ActionResult Index()
{
    ViewData["SomeProperty"] = "Hello";
    return View();
}

Просмотр (синтаксис бритвы):

@ViewData["SomeProperty"]

Данные о времени

Все, что вы храните в TempData, останется в tempdata до тех пор, пока вы его не прочитаете, независимо от того, есть ли между ними один или несколько HTTP-запросов.

Действия

public ActionResult Index()
{
    TempData["SomeName"] = "Hello";
    return RedirectToAction("Details");
}


public ActionResult Details()
{
    var someName = TempData["SomeName"];
}

Ответ 2

TempData

означает очень короткоживущий экземпляр, и вы должны использовать его только во время текущего и последующих запросов! Поскольку TempData работает таким образом, вы должны точно знать, каким будет следующий запрос, и перенаправление на другое представление - это единственный раз, когда вы можете это гарантировать. Таким образом, единственный сценарий, в котором использование TempData будет надежно работать, - это когда вы перенаправляете. Это связано с тем, что перенаправление убивает текущий запрос (и отправляет HTTP-код статуса 302 Объект, перемещенный клиенту), а затем создает новый запрос на сервере для обслуживания перенаправленного представления. Оглядываясь на предыдущий пример кода HomeController, это означает, что объект TempData может давать результаты иначе, чем ожидалось, потому что не может быть гарантировано получение следующего запроса. Например, следующий запрос может исходить из совершенно другого экземпляра машины и браузера.

ViewData​​p >

ViewData - это объект словаря, в который вы помещаете данные, который затем становится доступным для представления. ViewData является производным класса ViewDataDictionary, поэтому вы можете получить доступ к знакомому синтаксису "ключ/значение".

ViewBag

Объект ViewBag является оболочкой объекта ViewData, которая позволяет создавать динамические свойства для ViewBag.

public class HomeController : Controller
{
    // ViewBag & ViewData sample
    public ActionResult Index()
    {
        var featuredProduct = new Product
        {
            Name = "Special Cupcake Assortment!",
            Description = "Delectable vanilla and chocolate cupcakes",
            CreationDate = DateTime.Today,
            ExpirationDate = DateTime.Today.AddDays(7),
            ImageName = "cupcakes.jpg",
            Price = 5.99M,
            QtyOnHand = 12
        };

        ViewData["FeaturedProduct"] = featuredProduct;
        ViewBag.Product = featuredProduct;
        TempData["FeaturedProduct"] = featuredProduct;  

        return View();
    }
}

Ответ 3

namespace TempData.Controllers
{
 public class HomeController : Controller
 {
    public ActionResult Index()
    {
        TempData["hello"] = "test"; // still alive
        return RedirectToAction("About");
    }

    public ActionResult About()
    {
        //ViewBag.Message = "Your application description page.";
        var sonename = TempData["hello"]; // still alive (second time)
        return RedirectToAction("Contact");
    }


    public ActionResult Contact()
    {
        var scondtime = TempData["hello"]; // still alive(third time)
        return View();
    }
    public ActionResult afterpagerender()
    {
        var scondtime = TempData["hello"];//now temp data value becomes null

        return View();
    }
}

}

В приведенном выше разговоре для всех мало что путает. если вы посмотрите на мой выше код, tempdata похож на концепцию viewdata, но затем он также может перенаправить другое представление. это первая точка.

вторая точка:            некоторые из них говорят, что он сохраняет ценность до чтения, и лишь немногие из них спрашивают, что так будет читать только время? не так. Фактически, вы можете читать любое количество времени внутри вашего кода в одном почтовом пакете перед рендерингом страницы. после того, как вы сделали визуализацию страницы, если вы снова сделаете postpack (request), значение tempdata станет NULL.

даже вы запрашиваете так много времени, но значение tempdata все еще жив → этот случай ваш номер запроса не должен считывать значение данных temp.