首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >避免在业务层中使用SelectList (MVC 3)

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

Stack Overflow用户
提问于 2011-02-18 21:13:54
回答 3查看 1.7K关注 0票数 6

我正在开发一个相当大的MVC 3应用程序,我遇到了一个我觉得不太合适的问题。这个问题需要一个小的设置来理解,下面是我目前正在操作的前提:

  • 视图应该是强类型的(应避免ViewBag/ViewData)
  • 由于视图是强类型的,所以应该创建封装视图需要显示的所有数据的视图模型对象。
  • 当我们需要下拉菜单时,我们应该有两个属性:
    1. 模型中存储下拉列表所选值的属性。
    2. 视图模型中的SelectList属性,表示下拉列表中的项

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

麻烦就在这里。共享编辑器模板的模型类型设置为模型类。这意味着组成编辑器模板的部分视图不能访问存储下拉项列表的包含视图模型对象。

我能够通过将SelectList属性直接添加到业务层中的模型类来“解决”这个问题,而不是将它保存在视图模型中。但是SelectList类是特定于MVC的,这又意味着我的业务层依赖于MVC。这似乎不对,因为BL应该是不可知论的UI。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-05-20 20:26:14

最后我们走了一条简单的路。在业务层,我们只是将类型更改为普通的旧Object。我认为,不管表示层是什么,它都需要某种列表来包含可用的选项。

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

票数 0
EN

Stack Overflow用户

发布于 2011-02-18 21:18:04

在此之前,一切看起来都很好,而且设计得很好(这一点并不奇怪,因为这一点会让您头痛:-):

大多数模型类都有一个共享编辑器模板,可以在多个视图中使用。

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

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

票数 4
EN

Stack Overflow用户

发布于 2011-02-18 21:19:52

您有两个主要解决方案-- IMHO:

1.为业务逻辑实体生成DTO/模型

您可以使用AutoMapper来最小化复制代码。您将实现视图和业务逻辑之间的良好分离。然而,对于大型应用程序来说,这可能很费时。

2.使用扩展方法

不是在EF实体部分类中声明SelectList属性,而是使用与视图相关的代码来污染您的业务逻辑,而是在Web中为您的EF实体创建扩展方法。您可以将与视图相关的代码从BL移动到web项目,并保持类型安全。

示例:

业务逻辑组装

代码语言:javascript
复制
// This is EF entity
public partial class FooTable
{
    public long Id { get; set; }
    public string Name { get; set; }
}

Web组件

代码语言:javascript
复制
public static class FooTableExtensions
{
    public static SelectList GetSelectList(this IEnumerable<FooTable> fooTables)
    {
        return new SelectList(); // Create your select list from FooTables here.
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5046641

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档