Вопрос

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

Это было полезно?

Решение

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

Так что в основном это заменяет Волшебные струны:

ViewData["Foo"]

с Волшебные свойства:

ViewBag.Foo

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

Я продолжаю обвинять Microsoft, чтобы когда -либо представлять эту концепцию в MVC.

Название свойств чувствителен к корпусу.

Другие советы

Внутренне Viewbag Свойства хранятся как пары имени/значения в Словарь ViewData.

ПРИМЕЧАНИЕ. В большинстве предварительных версий MVC 3 свойство ViewBag было названо The 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.)

Viewbag vs 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"]

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>

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

По умолчанию пример ASP.NET есть на странице макета:

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

и в любом месте

ViewData["Title"] = "Details";

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

Наиболее заметная разница - это ViewData сильно напечатанный словарь, покаViewBag динамический тип.

Обратите внимание, что данные внутри ТО ЖЕ САМОЕ

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

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

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

Зная тонкие различия, использование того или иначе - это гораздо больше вкусового предпочтения.

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

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

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

Если вы связываетесь с какой -то «моделью» и имеете случайные элементы «Viewbag» или «ViewData», то это затрудняет автоматическое тестирование.

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

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

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

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

Ниже приведена разница в точке в отношении ViewData, Viewbag, Tempdata и Session.Credit/Socied AskforProgram.in , Перейдите по ссылке для примера кода, о котором я не упомянул здесь.

  1. ViewData в MVC

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

    • Viewbag - это свойство ControllerBase Class.
    • 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.
    • Сессия-это коллекция словарей ключей.
    • Сессия была введена в версии MVC 1.0.
    • Tempdata работает с .NET Framework 1.0 и выше.
    • Нужно сделать преобразование кода типа при перечислении.
    • Объект сеанса сохраняет данные для всех запросов. Действительно для всех запросов, никогда не истекает.

Хотя у вас может не быть технического преимущества в выборе одного формата над другим, вы должны знать о некоторых важных различиях между двумя синтаксисами. Одно очевидное отличие состоит в том, что Viewbag работает только тогда, когда ключ, к которому вы получаете доступ, является действительным C# Identifi Er. Например, если вы размещаете значение в ViewData [«Ключ с пробелами»], вы не можете получить доступ к этому значению, используя Viewbag, потому что код не компилируется. Другая ключевая проблема, которую следует учитывать, заключается в том, что вы не можете пройти в динамических значениях в качестве параметров методам расширения. Компилятор C# должен знать реальный тип каждого параметра во время компиляции, чтобы выбрать правильный метод расширения. Если какой -либо параметр является динамическим, компиляция потерпит неудачу. Например, этот код всегда будет сбой: @html.textbox ("name", viewbag.name). Чтобы обойти это, либо используйте ViewData ["name"], либо бросьте VA

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

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

In View:

@ViewBag.Name 
@ViewData["Name"] 

Таким образом, мы можем заставить его использовать значения для передачи информации между контроллером на другую страницу с помощью данных Temp

Одно основное отличие, которое я заметил между ViewData и Viewbag:

ViewData: Он вернет объект, не имеет значения, что вы присвоили в этом, и вам нужно снова вернуть исходный тип.

Viewbag: Достаточно разумно вернуть точный тип того, что вы присвоили ему. Не имеет значения погоды, вы назначили простой тип (т.е. int, строка и т. Д.) или комплексный тип.

Пример: Код контроллера.

 namespace WebApplication1.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            Products p1 = new Products();
            p1.productId = 101;
            p1.productName = "Phone";
            Products p2 = new Products();
            p2.productId = 102;
            p2.productName = "laptop";

            List<Products> products = new List<Products>();
            products.Add(p1);
            products.Add(p2);
            ViewBag.Countries = products;
            return View();
        }
    }
    public class Products
    {
        public int productId { get; set; }
        public string productName { get; set; }
    }
}

Просмотреть код.

<ul>
            @foreach (WebApplication1.Controllers.Products item in ViewBag.Countries)
            {
            <li>@item.productId &nbsp;&nbsp;&nbsp;@item.productName</li>
            }
        </ul>

Выходной экран.

enter image description here

Просмотреть данные

  1. ViewData используется для передачи данных из контроллера для просмотра
  2. ViewData получен из класса ViewDataDictionary и является в основном словарным объектом IEKEYS и значениями, где ключи являются строкой, а значения будут объектами.
  3. Данные тип необходимы при извлечении данных из ViewData из -за его типа объектов данных, а также NULL VVALUE Проверка BEFOR CASTING, в противном случае он нарушит приложение. Если происходит перенаправление, то его значение становится нулевой чтение полной разницы между Tempdata ViewData и View Bag

http://www.gurujipoint.com/2017/09/view-data-viewbag-and-tempdata.html

ViewData
  1. ViewData используется для передачи данных из контроллера для просмотра
  2. Это получено из класса ViewDataDictionary
  3. Он доступен только для текущего запроса
  4. Требуется тип для сложного типа данных и проверки на нулевые значения, чтобы избежать ошибки
  5. Если происходит перенаправление, то его значение становится нулевым
Viewbag
  1. Viewbag также используется для передачи данных из контроллера в соответствующий вид
  2. Viewbag - это динамическое свойство, которое использует новые динамические функции в C# 4.0
  3. Он также доступен только для текущего запроса
  4. Если происходит перенаправление, то его значение становится нулевым
  5. Не требует типа для сложного типа данных

Здесь ViewData а также Viewbag оба используются передавать данные из Контроллер к Вид.

1. ViewData

- ViewData- это словарный объект, который получен из ViewDataDictonary учебный класс.

- Данные разрешают только один запрос, значения ViewData очищаются, когда происходит перенаправление страницы.

- Значение ViewData должно быть напечатано CATE перед использованием.

Пример: В контроллере

public ActionResult PassingDatatoViewWithViewData()
{
      ViewData["Message"] = "This message shown in view with the ViewData";
      return View();
}

С учетом

@ViewData["Message"];

- с ViewData- это такая пара Ключ а также Ценность, Сообщение является ключевым, а в инвертированном значении запятой - это значение.

- Данные просты, поэтому мы не можем использовать TypeCasting здесь, если данные сложны, то используя литье типа.

public ActionResult PassingDatatoViewWithViewData()
{
      var type= new List<string>
    {
        "MVC",
        "MVP",
        "MVVC"
    };
    ViewData["types"] = type;
    return View();
}

- с учетом данных можно извлечь как

<ul>
        @foreach (var items in (List<string>)ViewData["types"])
        {
         <li>@items</li>
        }
  </ul>

2. Viewbag

-Viewbag использует Dynamic Feature.viewbag Orbper вокруг ViewData.

- в виде вида типа требуется.

- То же, что и ViewData, если перенаправление происходит значение, становится нулевым.

Пример:

public ActionResult PassingDatatoViewWithViewBag()
{
          ViewData.Message = "This message shown in view with the ViewBag";
          return View();
}

С учетом

@ViewBag.vbMessage

-Для сложного типа используйте Viewbag

public ActionResult PassingDatatoViewWithViewBag()
{
          var type= new List<string>
        {
            "MVC",
            "MVP",
            "MVVC"
        };
        ViewBag.types = type;
        return View();
 }

- с учетом данных можно извлечь как

<ul>
       @foreach (var items in ViewBag.types)
       {
         <li>@items</li>
       }
</ul>

- Основное отличие в том, что Viewbag не требуется тип, но ViewData Требуется тип.

ViewBag и ViewData - это два средства, которые используются для передачи информации от контроллера к представлению в ASP.Net MVC.Целью использования обоих механизмов является обеспечение связи между контроллером и представлением.Оба имеют короткий срок службы, то есть значение обоих становится нулевым после того, как произошло перенаправление, т. Е. как только страница перенаправляется с исходной страницы (где мы устанавливаем значение 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"] 

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top