我正在使用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原则?
这样做还是我需要做点什么?
答案 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,然后将其传递给您的视图。
当然它会起作用,但这不是模型 - 视图 - 控制器的想法。