【问题标题】:MVC2 Modelbinder for List of derived objects派生对象列表的 MVC2 Modelbinder
【发布时间】:2010-03-10 11:21:36
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 目前不适用于 MVC 4+
    猜你喜欢
    • 2022-01-07
    • 1970-01-01
    • 2021-06-22
    • 2016-01-15
    • 2018-12-31
    • 2013-10-10
    • 1970-01-01
    • 2019-05-03
    • 1970-01-01
    相关资源
    最近更新 更多