我正在开发一个多层的,使用 ASP.NET MVC 3 和实体框架。我有一个名为“站点”的实体,它属于域层。在域实体视图模型和视图中直接提及是否可以接受?
视图模型
public IList <Domain.Entities.Site> Sites;
看法
foreach (var item in Model.Sites)
{
...
}
我正在开发一个多层的,使用 ASP.NET MVC 3 和实体框架。我有一个名为“站点”的实体,它属于域层。在域实体视图模型和视图中直接提及是否可以接受?
视图模型
public IList <Domain.Entities.Site> Sites;
看法
foreach (var item in Model.Sites)
{
...
}
通常不会。ViewModel 的重点是仅从模型中抽象出所需的信息。
您应该有一个也对应于站点模型的 ViewModel。
所以你会有:
// assuming the Domain model is what we're talking about
public class DomainViewModel
{
public IList<SiteViewModel> Sites { get; set; }
}
我认为在您的视图中引用域实体是完全可以接受的。如果您不需要为视图转换域实体中的任何信息,那么使用 ViewModel 将其抽象出来是多余的。
您可能会发现在这个主题上有不同的意见,但真正归结为抽象出领域实体是否会增加任何价值。创建一个 ViewModel 将增加一些未来的灵活性,也许对你来说这足以证明它的合理性。如果是这种情况,那么一定要这样做。但是不要觉得你必须出于对违反 MVC 的恐惧。
直接绑定到模型是一种短期解决方案。最好让视图模型包装您的模型,以防您需要绑定到与模型不直接相关的其他属性。即 bool CanDelete,bool IsEnabled...
一般来说,没有。
如果这是一个 QUICK 和 BASIC 应用程序,那么肯定是不情愿的。
除此以外的任何事情,您都在为自己开枪,而普遍接受的模式是使用 ViewModels 来保存您需要的所有数据(包括 SelectList 数据等,而不是使用 ViewBag。
顺便说一句,在 ViewBag 上,也请避免: http ://completedevelopment.blogspot.com/2011/12/stop-using-viewbag-in-most-places.html