用于派生对象列表的MVC2 Modelbinder

时间:2010-03-10 11:21:37

标签: asp.net-mvc-2 viewmodel modelbinders defaultmodelbinder

我想要一个使用Asp.net MVC 2中的Default Modelbinder的不同(派生)对象类型的列表。

我有以下ViewModel:

public class ItemFormModel
    {       
        [Required(ErrorMessage = "Required Field")] 
        public string Name { get; set; }
        public string Description { get; set; }

        [ScaffoldColumn(true)]
        //public List<Core.Object> Objects { get; set; }       
        public ArrayList Objects { get; set; }                  
    }

该列表包含不同派生类型的对象,例如

public class TextObject : Core.Object
    {
        public string Text { get; set; }
    }

    public class BoolObject : Core.Object
    {
        public bool Value { get; set; }
    }

如果我使用List或ArrayList实现并不重要,所有内容都在表单中得到了很好的搭建,但是当回发到ActionResult时,modelbinder并没有为我解析派生对象类型属性。

Viewmodel结构能够获得处理不同对象类型列表的好方法是什么?为每个对象类型(例如List,List等)添加一个额外的列表对我来说似乎不是一个好的解决方案,因为这在构建viewmodel并将其映射回域模型时会产生很多开销。

考虑在自定义模型绑定器中绑定所有属性的其他方法,如何在没有大量开销的情况下使用数据注释方法(验证所需的属性等)?

1 个答案:

答案 0 :(得分:4)

查看Derived Type ModelBinder in MvcContrib。这允许您通过'typestamping'进程模拟绑定到派生类型 - 在使用RenderTypedPartial(...)帮助程序时会自动处理。 MvcContrib partials跨部分维护绑定状态,因此Name / Id前缀在深度对象图上得到适当维护。如果您使用其他机制,如模板,那么您需要自己处理类型印刷。这在文档页面中进行了解释。

回到您的问题以及如何使用ModelBinder解析派生类型,您可以在类似于WCF KnownTypeAttribute的机制中使用属性注册派生类型变体,或者您可以在启动时进行注册。无论哪种方式,这些变化都会被记录一次并保留用于性能考虑。

模型绑定器还以不干扰数据注释/验证属性的方式解决了这个问题。它们将在任何其他场景中按预期工作。