从ViewModel访问数据库是否违反了MVC原则?

时间:2011-12-01 13:40:26

标签: c# asp.net-mvc entity-framework asp.net-mvc-2

我正在使用Entity Framework

在MVC2中编写应用程序

据我所知,ViewModel必须只包含没有任何逻辑数据的数据。假设我Product类是ADO.NET实体,当EntityCollection<ProductToStatus>是多对多表时,该实体具有ProductToStatus。我有ProductModel(在其.ctor中占用Product),传递给View

public class ProductModel
{
    ....
    public Product Item {get; private set;}
    ...
    public ProductModel(Product item)
    {
         ...
         this.Item = item;
         ...
    }
}

View中,我需要呈现产品的所有状态,因此要执行此操作,我需要在item.ProductToStatus.Select(s=>s.ProductStatus).ToList();中通过ProductModel查询数据库,但这会向数据库发送请求它是否违反了MVC原则?

这样做还是我需要做点什么?

2 个答案:

答案 0 :(得分:5)

你不应该这样做。您的控制器应该收集视图所需的数据,并将其打包并将其传递给视图以进行渲染。

因此,您的ProductModel应该在构造函数中或通过属性(我的偏好)获取其所需的Product的详细信息,或者应该在推送时使用Product它是Product给予构造函数中的所有查询以设置其所有内部字段但不保持对Product周围的引用。我不喜欢在构造函数中使用ProductModel,特别是因为它在构造函数中的工作并不好,但是根据它正在做什么,它可能没问题。

最好让你的var model = new ProductModel() { Statuses=product.ProductToStatus.Select(s=>s.ProductStatus).ToList(), Name=product.Name, OtherProperty=GetPropertyValue(product), //etc } 拥有大量属性,然后就可以像这样创建它:

{{1}}

答案 1 :(得分:1)

是的,它违反了模式。您应该在Controller中填充ViewModel,然后将其传递给您的视图。

当然它会起作用,但这不是模型 - 视图 - 控制器的想法。