避免在业务层中使用SelectList(MVC 3)

She*_*els 6 asp.net-mvc entity-framework entity-framework-4 asp.net-mvc-3

我正在研究一个相当大的MVC 3应用程序,我遇到了一个对我来说闻不通的问题.这个问题需要一些设置才能理解,所以这里有我正在操作的前提:

  • 视图应该是强类型的(应避免使用ViewBag/ViewData)
  • 由于视图是强类型的,因此应创建视图模型对象,以封装视图需要显示的所有数据
  • 当我们需要下拉菜单时,我们应该有两个属性:
    1. 模型中的属性,用于存储下拉列表的选定值
    2. 一个SelectList视图模型,代表了降下来的物品属性
  • 视图本身始终使用@Html.DropDownListFor()辅助方法
  • 我们正在使用Entity Framework 4,并让它从我们已经设计的数据库中生成实体类
  • 为了避免重复并利用LINQ,我们不是创建自己独立的业务/模型类,而是添加到实体框架生成的部分类
  • 我们编写的这些部分类位于业务层中,以使所有内容都能正确编译
  • 大多数模型类都有一个共享编辑器模板,可以在多个视图中使用

这就是麻烦的来源.共享编辑器模板的模型类型设置为模型类.这意味着构成编辑器模板的局部视图无权访问包含下拉项列表的包含视图模型对象.

我能够通过SelectList直接向业务层中的模型类添加属性来"解决"这个问题,而不是将其保留在视图模型中.但是这个SelectList类特定于MVC,这反过来意味着我的业务层依赖于MVC.这对我来说似乎不对,因为BL应该与UI无关.

还有其他人遇到过这个问题吗?我该怎么解决这个问题?我的一个前提也可能是错的.

She*_*els 0

好吧,我们最终采取了简单的方法。在业务层中,我们只是将类型更改为普通旧的Object。我认为,无论表示层如何,都需要某种列表来包含可用选项。

我知道这不像 @Darin 和 @Jakub 那样非常干净,但我不认为我们的最终结果有任何不同,除了我们避免了编写和/或设置之间的一大堆映射对象。