2011-11-30 53 views
6

我在我的MVC应用程序中大量使用ViewBag,这是否被认为是不好的做法?我不确定是否花时间创建ViewModels(但我认为这更适合MVVM而不是MVC)或继续大量使用ViewBag。有什么争论和反对呢?例如控制器方法将返回它的模型(通常是一个简单的域实体)以及下面的调用到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"; 

回答

9

像这样的问题通常会从篱笆的两侧得到答案。很多人觉得像这样使用ViewBag是一个糟糕的设计(包括我自己)。它使你的控制器不易测试。您的意见不是强类型,等等。

使用ViewModel通常是一个好习惯。不要让你的模型成为一个领域模型,而要创建一个特定于你所显示的视图的模型。这样,它可以100%定制,以满足您对此特定视图的需求。一旦你这样做,你会发现你并不需要使用ViewBag。它有时可以创建很多额外的代码(每个视图一个视图模型),但代码非常简单,对一个视图进行更改不会破坏其他视图。

+0

谢谢,这几乎是我所期待的。 – Paul

+0

再一次,请记住像这些问题是非常主观的。对你有用的东西可能不适用于其他人,对他人有用的东西可能不适合你。我只是从我自己的角度回答:) – Dismissile

0

为什么不使用的人作为你的模型?这样你可以使用强类型的视图。我个人的观点是ViewBag几乎是'魔术串',虽然它在小规模工作很好,但在大型应用程序和项目中,您几乎要迫使每个人都记住所有的魔术串。此外,您没有获得使用模型和强类型视图的类型安全性。