ASP.NET MVC中的扁平ViewModel类与嵌套ViewModel类

32

我希望能听到关于ViewModel定义的两种不同方法的意见。

我有一个Company类。

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

在创建和编辑视图中,我需要一个国家列表来填充下拉列表框以供选择CountryID。我可以看到两种广泛的选项来构建ViewModel,具体如下。

嵌套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; }
....
}

目前我倾向于使用嵌套方法,因为这样可以避免我再次定义字段,但我想听取更好的方法和意见。

谢谢

2个回答

24

我个人更喜欢嵌套式的表现方式,因为当您使用部分视图时,它会导致更合理的设计。您可能在整个应用程序中都使用了一个 CompanyPartialView ,并知道如何呈现一个Company,因此将Company公开为嵌套结构十分有意义。

另一方面,对于数据录入,扁平化的ViewModel类最易于操作。您只需拥有一堆映射到单个属性的表单字段。因此,我的策略通常是将其展平用于数据输入页面,并将其嵌套用于演示/报告页面。


1
完全同意。我使用嵌套的for表现形式 - CompanyViewModel - 和扁平的for数据输入 - CompanyCreateEditViewModel - Jarrett Meyer
@JarrettMeyer 你是否使用AutoMapper来处理嵌套和扁平的ViewModel?有没有任何问题?我只是好奇,因为我在使用AutoMapper处理嵌套视图模型时遇到了问题。 - Willy
如果部分视图获取了整个主模型,并且字段生成为 m => m.NestedView.Field,则自动映射对我有用。否则,你必须手动映射它。 - Muflix

5

我更喜欢使用嵌套,原因如下:

  • 这就是面向对象的精髓。
  • 如果您使用LINQ to SQL或实体框架(ORM),您可以直接传递ORM对象,而无需传递各种属性。
  • 您可以传递其他视图,因此您可以为部分视图创建单独的模型,如果该视图使用了部分视图,则可以将部分视图模型类作为视图模型类的属性传递。

在我看来,希望对您有所帮助。


你是将整个模型传递给部分视图还是只传递所需的部分?我认为只传递嵌套视图模型就可以了,但是 AutoMapper 无法识别来自部分视图的属性是嵌套模型的成员。 - Muflix
1
这要看情况。部分视图需要什么?部分视图是否是较大表单的一部分(如果是,则需要整个模型以便ID路径正确)。如果部分视图是自包含的,则将其保持隔离到子模型中是可以的。在您的情况下,如果您需要AUtoMapper识别某些属性,则可能需要传递整个模型。 - Brian Mains

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接