【问题标题】:It is acceptable to an entity directly mentioned in viewmodel and the views?视图模型和视图中直接提到的实体是否可以接受?
【发布时间】:2012-04-16 19:26:36
【问题描述】:

我正在开发一个多层的,使用 ASP.NET MVC 3 和实体框架。我有一个名为“站点”的实体,它属于域层。在域实体视图模型和视图中直接提及是否可以接受?

视图模型

public IList <Domain.Entities.Site> Sites;

查看

foreach (var item in Model.Sites)
{
...
}

【问题讨论】:

  • 我不明白为什么它不是“可接受的”——如果那是最接近具有该数据的表示层的对象。

标签: c# asp.net asp.net-mvc-3 entity-framework domain-driven-design


【解决方案1】:

通常不会。 ViewModel 的目的是仅从模型中抽象出所需的信息。

您应该有一个也对应于站点模型的 ViewModel。

所以你会:

// assuming the Domain model is what we're talking about
public class DomainViewModel
{
    public IList<SiteViewModel> Sites { get; set; }
}

【讨论】:

  • 不会因为“SiteViewModel”具有与实体相同的属性而重做?
  • @AdrianoSilva - 暂时可能,但这并不总是保证。将两者分开的目的是让您只将必要的信息传递给视图。视图可能不需要站点的所有成员。
【解决方案2】:

我认为在您的观点中引用域实体是完全可以接受的。如果您不需要为视图转换域实体中的任何信息,那么使用 ViewModel 将其抽象出来是多余的。

您可能会发现在这个主题上存在不同的意见,但真正归结为抽象出领域实体是否会增加任何价值。创建一个 ViewModel 将增加一些未来的灵活性,也许对你来说这足以证明它的合理性。如果是这种情况,那么一定要这样做。但是不要因为害怕违反 MVC 而觉得你必须这样做。

【讨论】:

    【解决方案3】:

    直接绑定到模型是一种短期解决方案。最好让视图模型包装您的模型,以防您需要绑定到与模型不直接相关的其他属性。即 bool CanDelete、bool IsEnabled...

    【讨论】:

      【解决方案4】:

      一般来说不会。

      如果这是一个 QUICK 和 BASIC 应用程序,那么肯定是不情愿的。

      除此之外的任何事情,您都在为自己开枪,而普遍接受的模式是使用 ViewModels 来保存您需要的所有数据(包括 SelectList 数据等,而不是使用 ViewBag。

      顺便说一句,在 ViewBag 上,也要避免这种情况: http://completedevelopment.blogspot.com/2011/12/stop-using-viewbag-in-most-places.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-17
        • 2011-05-13
        • 1970-01-01
        • 2011-02-28
        • 2017-10-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多