В чем разница между ViewData и ViewBag? - PullRequest
315 голосов
/ 16 января 2011

Я видел ViewBag в MVC 3. Чем это отличается от ViewData в MVC 2?

Ответы [ 17 ]

372 голосов
/ 16 января 2011

Используется динамическая функция C # 4.0. Он достигает той же цели, что и viewdata, и его следует избегать в пользу использования строго типизированных моделей view (так же, как и viewdata)

Так что в основном он заменяет магические строки :

ViewData["Foo"]

с магическими свойствами :

ViewBag.Foo

, для которого у вас нет безопасности времени компиляции.

Я продолжаю винить Microsoft за то, что она внедрила эту концепцию в MVC.

В именах свойств учитывается регистр.

41 голосов
/ 17 мая 2011

Внутренне Свойства ViewBag хранятся в виде пар имя / значение в словаре ViewData .

Примечание: в большинстве предварительных версий MVC 3 свойство ViewBag было названо ViewModel, как отмечено в этом фрагменте из примечаний к выпуску MVC 3:

(отредактировано 10-8-12) Было предложено опубликовать источник этой информации, которую я разместил, вот источник: http://www.asp.net/whitepapers/mvc3-release-notes#_Toc2_4

Контроллеры MVC 2 поддерживают свойство ViewData, которое позволяет передавать данные вшаблон представления с использованием API словаря с поздней привязкой.В MVC 3 вы также можете использовать несколько более простой синтаксис со свойством ViewBag для достижения той же цели.Например, вместо записи ViewData ["Message"] = "text", вы можете написать ViewBag.Message = "text".Вам не нужно определять какие-либо строго типизированные классы, чтобы использовать свойство ViewBag.Поскольку это динамическое свойство, вы можете просто получить или установить свойства, и оно будет динамически разрешать их во время выполнения.Внутри свойства ViewBag хранятся в виде пар имя / значение в словаре ViewData.(Примечание. В большинстве предварительных версий MVC 3 свойство ViewBag называлось свойством ViewModel.)

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

ViewBag против ViewData в MVC

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

Сходства между 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();
}   

Вызов в виде

@ViewBag.Name    
@ViewData["Name"]
29 голосов
/ 25 сентября 2013

ViewData: Требуется приведение типов для сложных типов данных и проверка на нулевые значения во избежание ошибок.

ViewBag: для сложных типов данных не требуется приведение типов.

Рассмотрим следующий пример:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        var emp = new Employee
        {
            EmpID=101,
            Name = "Deepak",
            Salary = 35000,
            Address = "Delhi"
        };

        ViewData["emp"] = emp;
        ViewBag.Employee = emp;

        return View(); 
    }
}

А код для View выглядит следующим образом:

@model MyProject.Models.EmpModel;
@{ 
 Layout = "~/Views/Shared/_Layout.cshtml"; 
 ViewBag.Title = "Welcome to Home Page";
 var viewDataEmployee = ViewData["emp"] as Employee; //need type casting
}

<h2>Welcome to Home Page</h2>
This Year Best Employee is!
<h4>@ViewBag.Employee.Name</h4>
<h3>@viewDataEmployee.Name</h3>
20 голосов
/ 03 февраля 2016

Все ответы предполагают, что ViewBag и / или ViewData должны передавать данные из Controller в Views, что является дезинформацией.и то, и другое очень полезно для передачи данных из Views в Layout или Partial to Views (или ViewComponents и т. д.). Это не эксклюзивно для контроллера.

, как в примере asp.net по умолчанию, это на странице макета:

<title>@ViewData["Title"] - MyApp</title>

и в любом представлении

ViewData["Title"] = "Details";

Итак, к вопросу: «В чем разница между ViewBag и ViewData

Самая заметная разницаis ViewData является строго типизированным словарем, а ViewBag является динамическим типом.

Обратите внимание, что данные внутри ОДИНАКОВЫ *

ViewData["Title"] = "MyTitle";
ViewBag.Title; // returns "MyTitle";

Когда использовать то или иное?

  • ViewBag не поддерживает недопустимые имена C #.вы не можете получить доступ к ViewData["Key With Space"] с помощью ViewBag
  • ViewBag.Something является динамическим, и у вас могут возникнуть проблемы при вызове методов (например, методов расширения), которым необходимо знать точный параметр во время компиляции.
  • ViewBag может проверять наличие синтаксического очистителя null: ViewBag.Person?.Name
  • ViewData имеет все свойства словаря, такие как ContainsKey, Add и т. Д., Поэтому вы можете использовать ViewData.Add("somekey", "somevalue")имейте в виду, что это может привести к исключениям.
  • Использование ViewData для представлений требует TypeCasting, в то время как ViewBag нет.

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

Обычно вы можете думать о ViewBag.AnyKey с псевдонимом ViewData["AnyKey"]

14 голосов
/ 22 декабря 2011

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

Если вы хотите «отправить» данные на экран, отправьте строго типизированный объект (AKA ViewModel), потому что его проще тестировать.

Если вы привязываетесь к какому-то типу «Модель» и имеете случайные элементы «viewbag» или «viewdata», то это делает автоматизированное тестирование очень трудным.

Если вы используете их, подумайте, как вы могли бы реструктурироватьи просто используйте ViewModels.

11 голосов
/ 02 марта 2011

Существуют некоторые тонкие различия, которые означают, что вы можете использовать ViewData и ViewBag немного иначе, чем представление. В этом сообщении изложено одно преимущество http://weblogs.asp.net/hajan/archive/2010/12/11/viewbag-dynamic-in-asp-net-mvc-3-rc-2.aspx, которое показывает, что в примере можно избежать приведения, используя ViewBag вместо ViewData.

6 голосов
/ 16 декабря 2013

viewdata: - это словарь, используемый для хранения данных между View и контроллером. Вам необходимо преобразовать объект данных view в его соответствующую модель в представлении, чтобы иметь возможность извлекать данные из него ...

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

2 голосов
/ 27 марта 2019

Ниже приведена двухточечная разница между ViewData, ViewBag, TempData & Session. Credit / copyed askforprogram.in , Перейдите по ссылке для примера кода, который я здесь не упомянул.

  1. Просмотр данных в MVC

    • ViewData является свойством класса ControllerBase.
    • ViewData является типом объекта словаря.
    • ViewData является коллекцией словаря значений и ключей.
    • ViewData была введена в версии MVC 1.0.
    • ViewData работает с .Net Framework 3.5 и выше.
    • Необходимо выполнить преобразование типа кода при перечислении.
    • Объект ViewData хранит данные только для текущего запроса.
  2. ViewBag в MVC

    • ViewBag является свойством класса ControllerBase.
    • ViewBag является типом динамического объекта.
    • ViewBag - это тип объекта.
    • ViewBag был представлен в версии MVC 3.0.
    • ViewBag работает с .Net framework 4.0 и выше.
    • ViewBag использует свойство и обрабатывает его, поэтому нет необходимости выполнять преобразование типов при перечислении.
    • Объект ViewBag хранит данные только для текущего запроса.
  3. TempData в MVC

    • TempData является свойством класса ControllerBase.
    • TempData - это тип словарного объекта.
    • TempData - это словарь-коллекция ключевых значений.
    • TempData был представлен в версии MVC 1.0.
    • TempData работает с .Net framework 3.5.и выше.
    • Необходимо выполнить преобразование типа кода при перечислении.
    • Объект TempData используется для данных между текущим запросом и последующим запросом.
  4. Сеанс в MVC

    • Сеанс является свойством контроллера (абстрактный класс).
    • Сеанс является типом HttpSessionStateBase.
    • Сеанс является словарем значения ключаcollection.
    • Сессия была введена в версии MVC 1.0.
    • TempData работает с .Net framework 1.0 и выше.
    • Необходимо выполнить преобразование типа кода при перечислении.
    • Объект сеанса хранит данныедля всех запросов.Действительно для всех запросов, никогда не истекает.
0 голосов
/ 22 апреля 2014

ViewBag и ViewData - это два средства, которые используются для передачи информации от контроллера для просмотра в ASP.Net MVC.Цель использования обоих механизмов - обеспечить связь между контроллером и View.Оба имеют короткую жизнь, то есть значение обоих становится нулевым, как только происходит перенаправление, т. Е. После перенаправления страницы с исходной страницы (где мы устанавливаем значение ViewBag или ViewData) на целевую страницу, как ViewBag, так и ViewDataстановится нулевым.

Несмотря на то, что оба этих сходства (ViewBag и ViewData) - это две разные вещи, если мы говорим о реализации обоих.Различия заключаются в следующем:

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

2.) При доступе к значениям из ViewData нам необходимо типизировать значения (типы данных), поскольку они хранятся в виде объектов в объекте.Словарь ViewData, но в этом нет необходимости, если мы обращаемся к этому значению в случае ViewBag.

3.) В ViewBag мы можем установить значение следующим образом:

      ViewBag.Name = "Value"; 

и можем получить доступследующим образом:

          @ViewBag.Name

Хотя в случае ViewData значения могут быть установлены и доступны следующим образом: Установка ViewData выполняется следующим образом:

ViewData["Name"] = "Value";

и доступ к значению, подобному этому

 @ViewData["Name"] 

Для более подробной информации нажмите здесь:

...