asp.net-mvc – 避免在业务层(MVC 3)中使用SelectList

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

>视图应该是强类型的(应避免使用ViewBag / ViewData)
>由于视图是强类型的,因此应创建视图模型对象,以封装视图需要显示的所有数据
>当我们需要下拉菜单时,我们应该有两个属性:

>模型中的属性,用于存储下拉列表的选定值
>视图模型中的SelectList属性,表示下拉列表中的项目

>视图本身始终使用@ Html.DropDownListFor()辅助方法
>我们正在使用Entity Framework 4,并让它从我们已经设计的数据库中生成实体类
>为了避免重复并利用LINQ,我们不是创建自己独立的业务/模型类,而是添加到实体框架生成的部分类
>我们编写的这些部分类位于业务层中,以使所有内容都能正确编译
>大多数模型类都有一个共享编辑器模板,可以在多个视图中使用

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

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

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

解决方法

在这一点上,一切看起来都非常好,设计也很好(这并不奇怪,因为这一点让你感到头痛:-)):

Most model classes have a shared editor template that can be used in multiple views

它的视图模型应该有编辑器模板,而不是EF模型.由于视图模型特定于视图的要求,因此您可以自由地将所需的任何信息放入其中,例如SelectList.因此,不要简单地定义将EF模型作为属性(不是视图模型)的根视图模型.定义旨在满足特定视图要求的视图模型.不要在视图模型层次结构中放置单个EF类,您将看到您的生活将变得多么简单:-)

如果视图模型中有重复的属性,请不要担心.这就是那些课程的设计目标.此外,AutoMapper可以大大简化模型和视图模型之间的映射.

相关文章

引言 本文从Linux小白的视角, 在CentOS 7.x服务器上搭建一个...
引言: 多线程编程/异步编程非常复杂,有很多概念和工具需要...
一. 宏观概念 ASP.NET Core Middleware是在应用程序处理管道...
背景 在.Net和C#中运行异步代码相当简单,因为我们有时候需要...
HTTP基本认证 在HTTP中,HTTP基本认证(Basic Authenticatio...
1.Linq 执行多列排序 OrderBy的意义是按照指定顺序排序,连续...