【问题标题】:Flat vs Nested ViewModel Classes in ASP.NET MVCASP.NET MVC 中的平面与嵌套 ViewModel 类
【发布时间】:2011-01-15 02:12:18
【问题描述】:

我正在寻找关于 ViewModel 定义的两种不同方法的一些意见

我有一个公司课程

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

目前我更喜欢嵌套方法,因为它使我不必再次定义字段,但我想将它开放给更好的方法和 cmets。

谢谢

【问题讨论】:

    标签: asp.net-mvc viewmodel


    【解决方案1】:

    我个人更喜欢嵌套的表示方法,因为当您使用局部视图时,它会带来更合乎逻辑的设计。您可能在整个应用程序中都使用了CompanyPartialView,并且知道如何呈现Company,因此将Company 公开为嵌套结构很有意义。

    另一方面,平面 ViewModel 类对于数据条目来说是最容易使用的。您只有一堆表单字段,它们都映射到各个属性。所以我的策略通常是将它们展平用于数据输入页面,并将它们嵌套用于演示/报告页面。

    【讨论】:

    • 完全同意。我使用嵌套表示 - CompanyViewModel - 使用平面表示数据输入 - CompanyCreateEditViewModel
    • @JarrettMeyer 您是否使用 AutoMapper 进行嵌套和平面视图模型?有什么问题吗?我只是好奇,在使用带有嵌套视图模型的 AutoMapper 时我的体验很糟糕
    • 如果局部视图获取整个主模型并且字段生成为 m => m.NestedView.Field,则自动映射器对我有效,否则我认为您必须手动映射它
    【解决方案2】:

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

    • 这就是面向对象的全部意义所在。
    • 如果您使用 LINQ to SQL 或实体或 ORM,您可以简单地传递 ORM 对象,而不必传递各种属性。
    • 您可以传递其他视图,因此您可以为分部视图创建单独的模型,如果该视图使用分部,您可以将分部视图模型类作为视图模型类的属性传递。

    恕我直言,HTH。

    【讨论】:

    • 您是将整个模型提供给局部视图还是只提供需要的模型?我虽然只给出嵌套视图模型是可以的,但自动映射器无法识别部分视图的属性是嵌套模型的成员
    • 视情况而定。局部视图需要什么?是较大表单的部分视图部分(然后您需要整个模型,以便 ID 路径正常工作)。如果局部视图是自包含的,则将其与子模型隔离是可以的。在您的实例中,如果您需要 AUtoMapper 来识别某些属性,这听起来像是传递整个模型的理由。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-03
    • 2016-03-11
    • 2011-05-02
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多