我正在开发一个相当大的MVC 3应用程序,我遇到了一个我觉得不太合适的问题。这个问题需要一个小的设置来理解,下面是我目前正在操作的前提:
SelectList属性,表示下拉列表中的项
@Html.DropDownListFor()助手方法。麻烦就在这里。共享编辑器模板的模型类型设置为模型类。这意味着组成编辑器模板的部分视图不能访问存储下拉项列表的包含视图模型对象。
我能够通过将SelectList属性直接添加到业务层中的模型类来“解决”这个问题,而不是将它保存在视图模型中。但是SelectList类是特定于MVC的,这又意味着我的业务层依赖于MVC。这似乎不对,因为BL应该是不可知论的UI。
还有其他人遇到过这个问题吗?我该怎么解决这个问题?我的一个前提也有可能是错的。
发布于 2011-05-20 20:26:14
最后我们走了一条简单的路。在业务层,我们只是将类型更改为普通的旧Object。我认为,不管表示层是什么,它都需要某种列表来包含可用的选项。
我知道这并不像per @Darin和@Jakub那样非常干净,但我认为我们的最终结果并没有任何不同,只是我们避免了在对象之间编写和/或设置大量映射。
发布于 2011-02-18 21:18:04
在此之前,一切看起来都很好,而且设计得很好(这一点并不奇怪,因为这一点会让您头痛:-):
大多数模型类都有一个共享编辑器模板,可以在多个视图中使用。
视图模型应该有编辑器模板,而不是EF模型。而且,由于视图模型特定于视图的需求,所以您可以自由地将所需的任何信息放入其中,比如本例中的SelectList。因此,不要简单地定义将EF模型作为属性的根视图模型(这不是视图模型)。定义一个为满足特定视图的需求而设计的视图模型。不要在视图模型层次结构中放置一个EF类,您将看到您的生活将变得简单得多:-)
如果视图模型中有重复的属性,请不要担心。这就是设计这些类的目的。此外,AutoMapper可以大大简化模型和视图模型之间的映射。
发布于 2011-02-18 21:19:52
您有两个主要解决方案-- IMHO:
1.为业务逻辑实体生成DTO/模型
您可以使用AutoMapper来最小化复制代码。您将实现视图和业务逻辑之间的良好分离。然而,对于大型应用程序来说,这可能很费时。
2.使用扩展方法
不是在EF实体部分类中声明SelectList属性,而是使用与视图相关的代码来污染您的业务逻辑,而是在Web中为您的EF实体创建扩展方法。您可以将与视图相关的代码从BL移动到web项目,并保持类型安全。
示例:
业务逻辑组装
// This is EF entity
public partial class FooTable
{
public long Id { get; set; }
public string Name { get; set; }
}Web组件
public static class FooTableExtensions
{
public static SelectList GetSelectList(this IEnumerable<FooTable> fooTables)
{
return new SelectList(); // Create your select list from FooTables here.
}
}https://stackoverflow.com/questions/5046641
复制相似问题