6

我在我的 MVC 应用程序中大量使用 ViewBag,这被认为是不好的做法吗?我不确定是花时间创建 ViewModel(但我认为这更适合 MVVM 而不是 MVC)还是继续大量使用 ViewBag。支持和反对这一点的论据是什么?示例控制器方法将返回它的模型(通常是一个简单的域实体)以及对 ViewBag 的以下调用:

            ViewBag.TotalItems = data.Count();
        ViewBag.FilteredItems = gridFilters;
        ViewBag.Action = "Events";
        ViewBag.Area = "People";
        ViewBag.EntityID = person.EntityID;
        ViewBag.OrganisationID = ID;
        ViewBag.Name = string.Format("{0} {1}", person.FirstName, person.LastName);
        ViewBag.IsEnabled = person.IsEnabled;
        ViewBag.EntityID = person.EntityID;
        ViewBag.Favourited = users.IsOnUserFavourites(person.EntityID);

        ViewBag.Columns = userColumns;

        ViewBag.Title = "Person : " + string.Format("{0} {1}", person.FirstName, person.LastName) + " - Events";
4

2 回答 2

9

像这样的问题通常会从栅栏的两边得到答案。很多人觉得像这样使用 ViewBag 是一个糟糕的设计(包括我自己)。它使您的控制器的可测试性降低。您的视图不是强类型的,等等。

使用ViewModel. 与其让您的模型成为域模型,不如创建一个特定于您正在显示的视图的模型。这样,它可以 100% 定制,以满足您对该特定视图的需求。你会发现一旦你这样做了,你真的不需要太多地使用 ViewBag。它有时会创建很多额外的代码(每个视图一个视图模型),但代码非常简单,对一个视图进行更改不会破坏任何其他视图。

于 2011-11-30T15:32:26.157 回答
0

为什么不使用 Person 作为您的模型?这样您就可以使用强类型视图。我个人的观点是 ViewBag 几乎是“魔术字符串”,虽然它在您是唯一开发人员的小规模上运行良好,但在较大的应用程序和项目中,您几乎迫使每个人都记住所有魔术字符串是什么。此外,您不会获得使用模型和强类型视图的类型安全性。

于 2011-11-30T15:16:05.660 回答