【问题标题】:ASP.NET MVC2: ViewModel for a polymorphic classASP.NET MVC2:多态类的 ViewModel
【发布时间】:2011-01-07 10:00:17
【问题描述】:

我正在制作一个 MVC2 应用来管理计费方案。这些计费方案可以是各种类型,例如每天、每周、每月等,所有类型都有其特定的属性。我的班级结构如下所示:

public abstract class BillingScheme { /* basic billing scheme properties */ }
public class BillingSchemeMonthly : BillingScheme
{
    public string SpecificMonths;
}
//etc. for other scheme types

我使用计费方案 ID 通过基类检索计费方案,它为我提供了正确类型的对象。

SpecificMonths 属性映射到一个数据库 varchar 字段,该字段包含一个 ; 分隔的月份数字字符串。我想将其拆分为一个数组,以便创建一个复选框列表,并且我最好使用视图模型中的外观属性来执行此操作。我可以直接在视图内完成,但这似乎违反了 MVC 模式。

问题是我只能专门为 BillingSchemeMonthly 创建这个视图模型,并且我不能将 BillingSchemeMonthly 转换为 BillingSchemeMonthlyViewModel。 我宁愿不在视图模型中实现克隆方法,因为整个计费方案非常大,属性的数量可能会增加。

提前感谢您的帮助。

【问题讨论】:

    标签: c# asp.net asp.net-mvc-2 polymorphism viewmodel


    【解决方案1】:

    你可以看看AutoMapper

    【讨论】:

    • 好建议!将对此进行调查。
    【解决方案2】:

    理想情况下,从模型转换为视图模型时,您将拥有一个单独的转换器类。

    在我们的 MVC 项目中,我们有两种类型的转换器,IConverter<TFrom,TTo> 定义了 Convert 方法,ITwoWayConverter<TFrom,TTo> 定义了 ConvertToConvertFrom 方法。

    然后,我们将转换器注入必要的控制器并使用它们进行所有转换。

    这可以保持一切整洁,并允许明确分离关注点。

    当我们实现这一点时,我们会专门为我们希望进行的转换类型创建一个新类:

        public class MonthlySchemeBillingToMonthlySchemeBillingViewModelConverter :      
                         IConverter<MonthlySchemeBilling,MonthlySchemeBillingViewModel>
            {
             public MonthlySchemeBillingViewModel Convert(MonthlySchemeBilling)
             {
               // Impliment conversion
             }
            }
    

    【讨论】:

    • 那基本上等于实现了一个Clone方法,不是吗?我希望避免手动填充所有属性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-11
    • 1970-01-01
    • 1970-01-01
    • 2011-06-02
    相关资源
    最近更新 更多