3

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

我有以下视图模型:

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 等)提供一个额外的列表对我来说似乎不是一个好的解决方案,因为这在构建视图模型并将其映射回域模型时都会产生很多开销。

考虑在自定义模型绑定器中绑定所有属性的另一种方法,我怎样才能在此处使用数据注释方法(验证所需属性等)而无需大量开销?

4

1 回答 1

4

查看MvcContrib 中的派生类型 ModelBinder。这允许您通过“typestamping”过程对派生类型进行模型绑定 - 在使用 RenderTypedPartial(...) 帮助程序时会自动为您处理。MvcContrib 部分维护跨部分的绑定状态,因此名称/ID 前缀在深层对象图中得到正确维护。如果您使用模板等其他机制,那么您需要自己处理类型标记。这在文档页面中进行了解释。

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

模型绑定器还以不干扰数据注释/验证属性的方式解决了这个问题。在任何其他情况下,它们都会按照您的预期工作。

于 2010-03-29T19:42:43.143 回答