Мы знаем это ViewData
или ViewBag
используем для передачи информации от контроллера к представлению.
Есть ли разница между ними? Например, с точки зрения производительности и того, рекомендуется ли использование одного из них.
Мы знаем это ViewData
или ViewBag
используем для передачи информации от контроллера к представлению.
Есть ли разница между ними? Например, с точки зрения производительности и того, рекомендуется ли использование одного из них.
В основном отличия заключаются в следующем:
ViewData
ViewData
является строго типизированным объектом словаря, в который данные вводятся с помощью знакомого синтаксиса "key
/ ".value
ViewData
происходит от классаViewDataDictionary
.ViewData["Dato"] = 1
@ViewData["Dato"]
ViewBag
ViewBag
представляет собой объект с динамическим типом, который позволяет создавать свойства на лету .ViewBag.Dato = 1
@ViewBag.Dato
В общем, использование одного или другого (я думаю) будет зависеть от того, как вам больше подходит, оба работают для вас, чтобы передать информацию от контроллера к представлению, если только вы не хотите передавать эту информацию во время более чем одного запроса , поэтому в этом случае рассмотрите возможность использования словаря данных
TempData
в сочетании с егоKeep()
.Ссылки на официальную документацию:
ViewData
ViewBag
TempData
ViewBag
это просто оберткаViewData
. Разница в том, что хотя онViewData
имеет типViewDataDictionary
(который реализует aIDictionary<string, object>
, онViewBag
имеет типdynamic
, который немного упрощает код.Пример:
Что касается разницы в производительности, то она должна быть незначительной, лучше беспокоиться о других местах, которые действительно могут быть узким местом, например, о доступе к базе данных.
Что касается того, что лучше, синтаксис
dynamic
немного короче, но это дело вкуса. Обратите внимание, что ни один из параметров не является строго типизированным, что может привести к ошибкам во время выполнения, если в этом случае вы неправильно наберете ключPersona
. Идеал на самом деле состоит в том, чтобы передавать всю информацию между контроллером и представлением черезModel
На самом деле они по-прежнему две стороны одной медали.
Основное отличие состоит в том, что в то время как ViewData — это словарь объектов, в котором вы можете получить доступ к элементам типа Object через строку, ViewBag — это динамический объект, в котором вы можете получить доступ к элементам через динамически созданные свойства и который может иметь определенный тип данных.
В момент истины MVC сохраняет информацию в том же контейнере, так что значение, определенное в контроллере,
ViewData["dato1"] = xxxxx
может быть доступно из представления какViewBag.dato1
и наоборот.У них обоих одна и та же цель — передача данных из контроллера в представление.
ViewData имеет тип Object, и для его использования необходимо выполнить приведение представления, в то время как ViewBag генерируется динамически с назначенным типом данных.
ViewData: требует приведения типов для данных сложных типов и проверки нулевых значений, чтобы избежать ошибок.
ViewBag: не требует приведения типов для сложных типов данных.
Контроллер:
Вид:
прежде всего спасибо за ваши ответы. Они прояснили мои сомнения, однако я хотел бы опубликовать еще один ответ, чтобы помочь прояснить этот вопрос, хотя я думаю, что они уже достаточно хорошо все рассмотрели.
Технически все данные передаются от контроллеров к представлениям через ViewDataDictionary (специализированный класс словаря), который называется ViewData. Вы можете устанавливать и читать значения в словаре ViewData, используя стандартный синтаксис словаря следующим образом:
Хотя это по-прежнему доступно, ASP.NET MVC 3 использовал ключевое слово C# 4 dynamic для упрощения синтаксиса. ViewBag — это динамический контейнер вокруг ViewData. Позволяет установить значения следующим образом:
Таким образом, ViewBag.CurrentTime эквивалентен ViewData["CurrentTime"]. Как правило, большая часть фактического кода, с которым вы столкнетесь, по большей части использует ViewBag вместо ViewData. У вас нет реального технического преимущества в выборе одного синтаксиса над другим. ViewBag — это просто сокращение синтаксиса, которое некоторые люди предпочитают синтаксису словаря. Просто выглядит лучше.
Хотя у вас может не быть технических преимуществ при выборе одного формата над другим, вы должны знать о некоторых важных различиях между ними.Синтаксис Одно очевидное отличие состоит в том, что ViewBag работает только тогда, когда ключ, к которому вы обращаетесь, является идентификатором C. # valid . Например, если вы поместите значение в ViewData ["Key With Spaces"], вы не сможете получить доступ к этому значению с помощью ViewBag, потому что код не будет компилироваться. Еще одна ключевая проблема, которую следует учитывать, заключается в том, что динамические значения нельзя передавать в качестве параметров методам расширения. Компилятор C# должен знать фактический тип каждого параметра во время компиляции, чтобы выбрать правильный метод расширения. Если какой-либо параметр является динамическим, сборка завершится ошибкой. Например, этот код всегда дает сбой: @Html.TextBox("name", ViewBag. Сладкий картофель). Чтобы избежать этого, используйте ViewData["Name"] или приведите значение к определенному типу: (string) ViewBag.Name.
ViewDataDictionary — это специализированный класс словаря, а не просто общий словарь.Одной из причин этого является то, что он имеет дополнительное свойство модели, которое позволяет сделать конкретный объект модели доступным для представления. Поскольку у вас может быть только один объект модели в ViewData, использовать его для передачи определенного класса в представление удобно. Это позволяет вашему представлению указать класс, который ожидает желаемый объект модели, что означает, что вы можете воспользоваться преимуществами строгой типизации.
Это перевод из книги, которую я считаю одной из лучших, которые я читал Professional ASP.Net MVC5.