2

我已经阅读了很多关于 MVC 架构中视图中的逻辑的问答,并且在大多数情况下,我同意业务逻辑不应该存在于视图中。然而话虽如此,当我将微软的 MVC 框架与实体框架结合使用时,我不断质疑我的方法,因为单个实体可以轻松访问外键关系,这最终导致我在一个内联执行 Linq to Entities 查询看法。

例如:

如果我有以下两个实体:

产品([PK]ProductId、标题、金额)

图片([PK]ImageId、[FK]ProductId、ImageTitle、DisplayOrder)

假设我有一个强类型的产品视图,并且我想显示主图像(最低显示顺序),那么我可以在视图中执行以下操作:

@{
     Image image = (from l in Model.Image
                    orderby l.DisplayOrder
                    select l).FirstOrDefault();
}

这是一个用于演示目的的简单示例,但这肯定会开始扭曲与 MVC 架构相关的规则,但另一方面,在 Controller 中执行此操作,然后(天堂禁止)将其插入 ViewBag 或 ViewData 肯定只是像犯罪一样多,并且管理多个不同的相关课程变得痛苦。

我曾经为复杂的模型创建自定义类,但它既耗时又丑陋,而且我不再认为实体框架可以快速轻松地将视图定义为主要模型(在本例中为产品)和然后使用 Linq 查询轻松检索产品的所有外围组件。

我很想知道其他人如何处理这种情况。

编辑:

我也经常做这样的事情:

@foreach(Image i in Model.Image.OrderBy(e => e.DisplayOrder).ToList())
{
   <img ... />
}
4

1 回答 1

0

我将采用“模型的自定义类”的方式,我同意它既费时又平凡,因此创建了http://automapper.codeplex.com/之类的工具来陪伴您完成这项任务。

总的来说,我和你有类似的感受。阅读一些内容说最好让您的域模型与您的存储无关,然后为您的视图模型提供与域模型不同的类,然后看到库实际上似乎“促进”了简单的方法(域类上的数据注释似乎比 EF fluent interface 等更简单)。

至少我们有我猜的选择!

模型绑定还有一个问题是,当您想要 POST 回模型数据并将其存储在数据库中时,您需要小心并确保 MVC 模型绑定器正确绑定所有字段。否则你可能会丢失一些数据。使用视图的自定义模型,它可能会更简单。

验证 MVC 为您提供了一种使用属性进行验证的方法,当您使用视图模型时,您可以使用此类注释自由地污染它,因为它是特定于视图的(并且验证也应该是特定于视图/控制器操作的)。当您使用 EF 类时,您将使用不相关(并且可能冲突)的逻辑污染这些类。

于 2012-09-13T11:04:57.650 回答