题
我在MVC应用程序中大量使用了ViewBag,这被认为是不良的做法吗?我不确定是花时间创建ViewModels(但是我认为它更适合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";
解决方案
这样的问题通常会从围栏的两侧得到答案。许多人认为使用这样的ViewBag是一个不好的设计(包括我自己)。它使您的控制器不可测试。您的观点不是强烈键入的,等等。
通常是一个好习惯 ViewModel
. 。而不是让您的模型是域模型,而是创建一个特定于您显示的视图的模型。这样一来,它可以100%定制根据您所需的特定视图来量身定制。您会发现,一旦执行此操作,您实际上并不需要太多使用ViewBag。有时可以创建很多额外的代码(每个视图一个视图模型),但是代码非常简单,对一个视图进行更改不会破坏其他任何内容。
其他提示
为什么不将人作为您的模型?这样,您可以使用强烈键入的视图。我个人的看法是,ViewBag几乎是“魔术弦”,尽管它在您是唯一的开发处的小规模上很好地运作良好,但在较大的应用程序和项目中,您几乎迫使每个人都记住所有魔术弦。另外,您不会获得使用模型和强烈键入视图的类型安全性。
不隶属于 StackOverflow