ViewBag, ViewData и TempData

Может ли какой-нибудь орган объяснить, когда использовать

  • TempData​​li >
  • ViewBag
  • ViewData​​li >

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

Я попытался использовать ViewBag, значение теряется к моменту достижения Controller Two.

Могу ли я узнать, когда использовать и какие преимущества или недостатки?

Спасибо

Ответ 1

1) TempData​​p >

Позволяет хранить данные, которые выживут для перенаправления. Внутри он использует сессию в качестве магазина для выпечки, а именно, что после перенаправления данные автоматически выселяются. Шаблон следующий:

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​​p >

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

Шаблон следующий:

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);
    }
}

Вид остается прежним.

Ответ 2

ASP.NET MVC предлагает нам три опции ViewData, ViewBag и TempData для передачи данных с контроллера для просмотра и последующего запроса. ViewData и ViewBag почти аналогичны, и TempData выполняет дополнительную ответственность. Давайте обсудим или получим ключевые моменты для этих трех объектов:

Сходства между ViewBag и ViewData:

  • Помогает поддерживать данные при переходе с контроллера на просмотр.
  • Используется для передачи данных с контроллера в соответствующее представление.
  • Короткое время жизни означает, что значение становится нулевым, когда происходит перенаправление. Это потому что их цель - обеспечить способ общения между контроллеры и представления. Его механизм связи в рамках сервер.

Разница между ViewBag и ViewData:

  • ViewData - это словарь объектов, который получен из Класс ViewDataDictionary и доступен с использованием строк в качестве ключей.
  • ViewBag - это динамическое свойство, которое использует новую динамическую функции в С# 4.0.
  • ViewData требует типизации для сложного типа данных и проверки null, чтобы избежать ошибок.
  • ViewBag не требует типизации для сложного типа данных.

Пример ViewBag и ViewData:

public ActionResult Index()
{
    ViewBag.Name = "Monjurul Habib";
    return View();
}


public ActionResult Index()
{
    ViewData["Name"] = "Monjurul Habib";
    return View();
} 

В представлении:

@ViewBag.Name 
@ViewData["Name"] 

TempData:

TempData также является словарем, полученным из класса TempDataDictionary и хранимым в сеансе коротких жизней, и это строковый ключ и значение объекта. Разница в том, что жизненный цикл объекта. TempData хранит информацию на время HTTP-запроса. Это означает только с одной страницы на другую. Это также работает с перенаправлением 302/303, потому что его в том же HTTP-запросе. Помогает поддерживать данные при переходе от одного контроллера к другому контроллеру или от одного действия к другому действию. Другими словами, при перенаправлении "TempData" помогает поддерживать данные между этими перенаправлениями. Он внутренне использует переменные сеанса. Использование данных Temp во время текущего и последующего запросов означает, что оно используется, когда вы уверены, что следующий запрос будет перенаправлен на следующий вид. Он требует типизации для сложного типа данных и проверки нулевых значений, чтобы избежать ошибки. Обычно используется для хранения только однократных сообщений, таких как сообщения об ошибках, сообщения проверки.

public ActionResult Index()
{
  var model = new Review()
            {
                Body = "Start",
                Rating=5
            };
    TempData["ModelName"] = model;
    return RedirectToAction("About");
}

public ActionResult About()
{
    var model= TempData["ModelName"];
    return View(model);
}

Последний механизм - это сеанс, который работает как ViewData, как словарь, который берет строку для ключа и объекта для значения. Этот хранится в клиенте Cookie и может использоваться в течение гораздо более длительного времени. Кроме того, требуется дополнительная проверка, чтобы никогда не иметь конфиденциальной информации. Что касается ViewData или ViewBag, вы должны использовать его разумно для производительности приложения. Потому что каждое действие проходит весь жизненный цикл регулярного запроса asp.net mvc. Вы можете использовать ViewData/ViewBag в своем дочернем действии, но будьте осторожны, чтобы вы не использовали его для заполнения несвязанных данных, которые могут загрязнить ваш контроллер.

Ответ 3

TempData​​STRONG >

В основном это как DataReader, после чтения данные будут потеряны.

Проверьте это видео

Пример

public class HomeController : Controller
{
    public ActionResult Index()
    {
        ViewBag.Message = "Welcome to ASP.NET MVC!";
        TempData["T"] = "T";
        return RedirectToAction("About");
    }

    public ActionResult About()
    {
        return RedirectToAction("Test1");
    }

    public ActionResult Test1()
    {
        String str = TempData["T"]; //Output - T
        return View();
    }
}

Если вы обратите внимание на приведенный выше код, RedirectToAction не влияет на TempData, пока не будет прочитан TempData. Итак, после чтения TempData значения будут потеряны.

Как я могу сохранить TempData после чтения?

Проверьте вывод в методе действий Test 1 и Test 2

public class HomeController : Controller
{
    public ActionResult Index()
    {
        ViewBag.Message = "Welcome to ASP.NET MVC!";
        TempData["T"] = "T";
        return RedirectToAction("About");
    }

    public ActionResult About()
    {
        return RedirectToAction("Test1");
    }

    public ActionResult Test1()
    {
        string Str = Convert.ToString(TempData["T"]);
        TempData.Keep(); // Keep TempData
        return RedirectToAction("Test2");
    }

    public ActionResult Test2()
    {
        string Str = Convert.ToString(TempData["T"]); //OutPut - T
        return View();
    }
}

Если вы обратите внимание на приведенный выше код, данные не теряются после RedirectToAction, а также после чтения данных, и причина в том, что мы используем TempData.Keep(). что

Таким образом, вы можете сделать это упорным, если хотите, в других контроллерах.

ViewBag/ViewData​​STRONG >

Данные сохраняются в соответствующем представлении

Ответ 4

TempData в Asp.Net MVC - одна из очень полезных функций. Он используется для передачи данных из текущего запроса на последующий запрос. Другими словами, если мы хотим отправить данные с одной страницы на другую страницу, в то время как перенаправление происходит, мы можем использовать TempData, но нам нужно сделать кое-какое соображение в коде для достижения этой возможности в MVC. Потому что жизнь TempData очень короткая и лежит только до полного загрузки целевого представления. Но мы можем использовать метод Keep() для сохранения данных в TempData.

Подробнее

Ответ 5

ViewBag, ViewData, TempData и состояние просмотра в MVC

http://royalarun.blogspot.in/2013/08/viewbag-viewdata-tempdata-and-view.html

ASP.NET MVC предлагает нам три опции ViewData, VieBag и TempData для передачи данных с контроллера для просмотра и в следующем запросе. ViewData и ViewBag почти аналогичны, и TempData выполняет дополнительную ответственность.

Сходства между ViewBag и ViewData:

Помогает поддерживать данные при переходе с контроллера на просмотр. Использовал к передавать данные от контроллера к соответствующему виду. Короткая жизнь означает значение становится нулевым, когда происходит перенаправление. Это потому, что их цель заключается в том, чтобы обеспечить способ связи между контроллерами и представлениями. это механизм связи в вызове сервера.

Разница между ViewBag и ViewData:

ViewData - это словарь объектов, который получен из Класс ViewDataDictionary и доступен с использованием строк в качестве ключей. ViewBag является динамическим свойством, которое использует новые динамические функции в С# 4.0. ViewData требует типизации для сложного типа данных и проверьте нулевые значения, чтобы избежать ошибки. ViewBag не требует typecasting для сложного типа данных.

Пример ViewBag и ViewData:

public ActionResult Index()

{  
    ViewBag.Name = "Arun Prakash";
    return View();    
}

public ActionResult Index()  
{
    ViewData["Name"] = "Arun Prakash";
    return View(); 
}

В режиме просмотра мы вызываем следующее:

@ViewBag.Name   
@ViewData["Name"]

TempData:

Помогает поддерживать данные при переходе с одного контроллера на другой контроллер или от одного действия к другому действию. Другими словами, когда вы redirect, "Tempdata" помогает поддерживать данные между этими перенаправлением. Он внутренне использует переменные сеанса. TempData предназначен для очень недолговечный экземпляр, и вы должны использовать его только в течение текущего и только последующие запросы

Единственный сценарий, в котором использование TempData будет надежно работать, - это когда вы перенаправляете. Это связано с тем, что перенаправление убивает текущий запрос (и отправляет HTTP-код статуса 302 объекта, перемещенный клиенту), а затем создает новый запрос на сервере для обслуживания перенаправленного представления.

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

public ActionResult Index()
{   
   var model = new Review()  
   {  
      Body = "Start",  
      Rating=5  
   };  

    TempData["ModelName"] = model;    
    return RedirectToAction("About");   
} 

public ActionResult About()       
{  
    var model= TempData["ModelName"];  
    return View(model);   
}  

Ответ 6

void Keep()

Calling this method with in the current action ensures that all the items in TempData are not removed at the end of the current request.

    @model MyProject.Models.EmpModel;
    @{
    Layout = "~/Views/Shared/_Layout.cshtml";
    ViewBag.Title = "About";
    var tempDataEmployeet = TempData["emp"] as Employee; //need typcasting
    TempData.Keep(); // retains all strings values
    } 

void Keep(string key)

Calling this method with in the current action ensures that specific item in TempData is not removed at the end of the current request.

    @model MyProject.Models.EmpModel;
    @{
    Layout = "~/Views/Shared/_Layout.cshtml";
    ViewBag.Title = "About";
    var tempDataEmployeet = TempData["emp"] as Employee; //need typcasting
    TempData.Keep("emp"); // retains only "emp" string values
    } 

Ответ 7

TempData будет всегда доступным до первого чтения, как только вы прочтете его, он недоступен, может быть полезен для передачи быстрого сообщения также для просмотра, которое исчезнет после первого чтения. ViewBag Его более полезно, когда вы быстро передаете кусок данных в представление, как правило, вы должны передавать все данные в представление через модель, но бывают случаи, когда вы моделируете прямо из класса, который является картой в базу данных, такую ​​как структура сущности в этом случае вы не можете изменить свою модель, чтобы передать новую часть данных, вы можете вставить ее в сумку ViewData - это просто индексированная версия ViewBag и была использована до MVC3

Ответ 8

Кроме того, область видимости отличается от viewbag и temptdata. viewbag основан на первом представлении (не разделяется между методами действий), но temptdata могут быть разделены между методом действия и только одним другим.