我读了很多Q&与MVC架构中的视图中的逻辑相关,并且在大多数情况下,我同意业务逻辑不应该存在于视图中。不过已经这么说了,我在使用Microsoft的MVC框架和实体框架时经常质疑我的方法,因为单个实体可以轻松访问外键关系,这最终会导致我在内部执行Linq to Entities查询。图。
例如:
如果我有以下两个实体:
产品([PK] ProductId,Title,Amount)
图片([PK] ImageId,[FK] ProductId,ImageTitle,DisplayOrder)
假设我有一个强类型的产品视图,并且我想显示主图像(最低显示顺序),那么我可以在视图中执行以下操作:
@{
Image image = (from l in Model.Image
orderby l.DisplayOrder
select l).FirstOrDefault();
}
这是一个用于演示目的的简单示例,但肯定会开始弯曲与MVC架构相关的规则,但另一方面在Controller中执行此操作然后(天堂禁止)将其插入ViewBag或ViewData将肯定是同样多的犯罪行为,并且管理多个不同的相关课程会变得很痛苦。
我曾经为复杂模型创建自定义类,但它耗时且难看,我不再看到这一点,因为实体框架可以快速轻松地将View定义为主要模型(在本例中为产品)然后使用Linq查询轻松检索产品的所有外围组件。
我很想知道其他人如何处理这种情况。
编辑:
我也经常这样做:
@foreach(Image i in Model.Image.OrderBy(e => e.DisplayOrder).ToList())
{
<img ... />
}
答案 0 :(得分:0)
我要去'模型的自定义类'的方式,我同意它耗费时间和平凡,因此创建了像http://automapper.codeplex.com/这样的工具,以配合你执行此任务。
总的来说,我对你有类似的感受。阅读一些东西说你的域模型与你的存储无关,然后你的视图模型与域模型不同,然后看到这些库实际上似乎“促进”了简单的方法(对你的域类的数据注释似乎比EF流畅的界面等更简单。)
至少我们有选择的猜测!
模型绑定还有一个问题是,当您想要回发模型数据并将其存储在数据库中时,您需要小心并确保MVC模型绑定器正确绑定所有字段。否则你可能会丢失一些数据。使用自定义视图模型,它可能更简单。
<强>验证强> MVC为您提供了一种验证使用属性的方法,当您使用视图模型时,您可以使用此类注释自由地污染它,因为它是特定于视图的(并且验证应该是视图/控制器操作特定的)。当您使用EF类时,您将使用不相关(并且可能相互冲突)的逻辑来污染这些类。