我想与在Asp.net MVC 2默认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; }                  
    }

和该列表包含diffent派生类型的对象,e.g。

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

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

如果我使用List或ArrayList中实现,一切都得到了很好的脚手架的形式,但回发到的ActionResult时ModelBinder的不为我解决派生对象类型的属性并不重要。

可能是什么视图模型结构的一个很好的解决方案来获得处理不同的对象类型的列表?拥有为每个对象类型(如列表,列表等),一个额外的名单似乎是对我来说不是一个好的解决办法,因为这是双方在建立视图模型和映射回领域模型有很多的开销。

有关的自定义模型粘结剂结合所有属性的另一种方法思考,我怎么能做出使用标注接近这里(验证所需的属性等)的数据,而无需大量的开销?

有帮助吗?

解决方案

查看派生类型ModelBinder的在MvcContrib 。这使您可以通过“typestamping”的过程modelbind到派生类型 - 这是使用RenderTypedPartial(...)助手时自动为您处理。 MvcContrib谐音保持整个谐音绑定状态,所以名称/ ID前缀正确维护上了深刻的对象图。如果使用其他机制,例如模板,那么你就需要处理typestamping自己。这是在文档页面说明。

再回到你的问题,并派生类型如何与ModelBinder的解决,可以在类似于WCF KnownTypeAttribute机制注册属性派生类型的变化,或者你可以做启动登记。无论哪种方式,这些变化被注册一次,出于性能考虑,扶住。

该模型粘合剂还解决了在不与数据注释干扰的方式该问题/验证特性。因为你希望他们在任何其他情况下,他们会工作。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top