ViewBag, ViewData и TempData - PullRequest
       28

ViewBag, ViewData и TempData

205 голосов
/ 03 ноября 2011

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

  1. TempData
  2. ViewBag
  3. ViewData

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

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

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

Спасибо

Ответы [ 8 ]

288 голосов
/ 03 ноября 2011

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

Представление остается тем же.

15 голосов
/ 19 июня 2013

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

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

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

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

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

ViewBag & ViewData Пример:

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


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

InПредставление:

@ViewBag.Name 
@ViewData["Name"] 

TempData:

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

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

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

11 голосов
/ 20 мая 2013

TempData

По сути это похоже на 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 после прочтения?

Проверьте вывод в методе действия Тест 1 и Тест 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

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

4 голосов
/ 10 января 2015

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

Подробнее

3 голосов
/ 08 ноября 2013

ViewBag, ViewData, TempData и View State в 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 - это динамическое свойство, использующее преимущества новых динамических функций в C # 4.0.ViewData требует преобразования типов для сложного типа данных и проверки на нулевые значения, чтобы избежать ошибки.ViewBag не требует преобразования типов для сложного типа данных.

ViewBag & ViewData Пример:

public ActionResult Index()

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

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

В View мы вызываем, как показано ниже:

@ViewBag.Name   
@ViewData["Name"]

TempData:

Помогает поддерживать данные при переходе с одного контроллера на другой контроллер или с одного действия на другое действие.Другими словами, когда вы перенаправляете, «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);   
}  
1 голос
/ 28 декабря 2015

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

1 голос
/ 10 апреля 2014
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
    } 
0 голосов
/ 16 августа 2016

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...