2010-02-10 38 views
28

我正在寻找一些意见上的两种不同的方法来定义视图模型平VS在ASP.NET MVC嵌套视图模型类

我公司拥有一支一流的

public class Company 
{ 
    public string Name { get; set; } 
    public int CountryID { get; set; } 
} 

对于创建和编辑的看法我需要一个国家列表来为CountryID选择填充一个DropDownList。我可以看到如何构建下面详细介绍的ViewModel的两个广泛选择。

嵌套视图模型

public class CompanyCreateEditViewModel 
{ 
    public Company Company { get; set; } 
    public IEnumerable<Country> Countries{ get; set; } 
.... 
} 

平视图模型

public class CompanyCreateEditViewModel 
{ 
    public string Name { get; set; } 
    public int CountryID { get; set; } 
    public IEnumerable<Country> Countries{ get; set; } 
.... 
} 

目前我有利于嵌套的方法,因为它节省了我从确定第二次场,但我想把它放在更好的方法和评论。

感谢

回答

21

我个人更喜欢呈现嵌套的方法,因为它在使用局部视图会导致一个更合乎逻辑的设计。你可能有跨如何呈现一个Company应用程序中所有使用的CompanyPartialView,所以它是一个很大的意义,露出Company为嵌套结构。

另一方面,对于数据条目,平面ViewModel类最容易使用。你只有一堆表单域都映射到单独的属性。所以我的策略通常是将它们拼合成数据输入页面并将它们嵌套到演示文稿/报告页面。

+1

完全同意。我使用嵌套的呈现 - 'CompanyViewModel' - 扁平数据输入 - 'CompanyCreateEditViewModel'。 – 2010-02-10 02:47:35

+0

@JarrettMeyer你使用AutoMapper嵌套和平面视图模型?有什么问题吗?我只是好奇,我使用嵌套视图模型使用AutoMapper时遇到了不好的经验 – Willy 2014-10-02 11:44:02

+0

我在使用AutoMapper时遇到了一个不好的经验...... – Worthy7 2016-08-30 06:07:07

5

我喜欢嵌套,有以下几个原因:

  • 这就是面向对象是所有有关。
  • 如果使用LINQ to SQL或实体或ORM,则只需传递ORM对象,而不必传递各种属性。
  • 您可以传递其他视图,因此您可以为局部视图创建单独的模型,并且如果该视图使用局部视图,则可以将局部视图模型类作为视图模型类的属性传递。

恕我直言,HTH。

+0

你给整个模型的局部视图或只需要一个?我虽然只给予嵌套视图模型没问题,但automapper无法识别来自部分视图的属性是嵌套模型的成员 – Muflix 2016-11-07 12:01:27

+1

这取决于。局部视图需要什么?部分视图是较大表单的一部分(然后您需要整个模型以便ID路径正常工作)。如果局部视图是自包含的,则将其与子模型隔离即可。在您的实例中,如果您需要AUtoMapper识别某些属性,可能听起来像传递整个模型的原因。 – 2016-11-07 14:47:32

+0

谢谢Brian。 – Muflix 2016-11-08 09:53:26