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

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

Ответы [ 17 ]

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

Здесь ViewData и ViewBag оба используются для передачи данных из Контроллер в Просмотр .

1.ViewData

- ViewData - объект словаря, производный от ViewDataDictonary class.

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

- перед использованием необходимо ввести значение ViewData cate.

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

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

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

@ViewData["Message"];

- с ViewData это пара типа ключ и значение , сообщение является ключом и в кавычках значение равно.

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

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 использует динамическую особенность. Оболочка ViewBag вокруг ViewData.

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

- То же, что и 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();
 }

- In View данные могут быть извлечены как

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

- основное отличие состоит в том, что ViewBag не требуется типизация, но ViewData требуется типографское оформление.

0 голосов
/ 07 сентября 2017

Просмотр данных

  1. ViewData используется для передачи данных из контроллера в представление
  2. ViewData является производным от класса ViewDataDictionary и в основном является объектом Dictionary ieKeys.и Значения, где Ключами являются Строка, а Значения будут объектами.
  3. При получении данных из ViewData требуется типизация данных из-за его типа данных Объекта, а также проверка нулевого значения перед приведением типа, иначе это приведет к поломке приложения.Если происходит перенаправление, его значение становится равным нулю. Полное различие между TempData ViewData и View Bag

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

0 голосов
/ 19 июня 2017

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

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

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

Ex: Код контроллера.

 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

0 голосов
/ 08 марта 2016

Хотя у вас может не быть технического преимущества при выборе одного формата перед с другой стороны, вы должны знать о некоторых важных различиях между двумя Синтаксисы. Одно очевидное отличие состоит в том, что ViewBag работает только тогда, когда ключ, к которому вы обращаетесь является действительным идентификатором C #. Например, если вы поместите значение в ViewData ["Key С пробелами "], вы не можете получить доступ к этому значению с помощью ViewBag, потому что код не будет компилироваться. Другой ключевой вопрос, который следует учитывать, это то, что вы не можете передавать динамические значения в качестве параметров к методам расширения. Компилятор C # должен знать реальный тип каждого параметр во время компиляции, чтобы выбрать правильный метод расширения. Если какой-либо параметр является динамическим, компиляция не удастся. Например, этот код будет всегда терпит неудачу: @ Html.TextBox ("имя", ViewBag.Name). Чтобы обойти это, либо используйте ViewData ["Name"] или приведите va

0 голосов
/ 27 марта 2014
public ActionResult Index()
{
    ViewBag.Name = "Monjurul Habib";
    return View();
}

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

In View:

@ViewBag.Name 
@ViewData["Name"] 
0 голосов
/ 04 сентября 2015

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

...