asp.net-mvc-2 - 派生对象列表的 MVC2 Modelbinder

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

我想要一个在 Asp.net MVC 2 中使用默认模型绑定(bind)器的不同(派生)对象类型的列表。

我有以下 View 模型:

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 实现都无关紧要,所有内容都很好地构建在表单中,但是模型绑定(bind)器在回发到 ActionResult 时不会为我解析派生对象类型属性。

对于 Viewmodel 结构来说,获取处理的不同对象类型列表的好的解决方案是什么?为每个对象类型(例如 List、List 等)提供一个额外的列表对我来说似乎不是一个好的解决方案,因为这在构建 View 模型和将其映射回域模型方面都会产生大量开销。

考虑在自定义模型绑定(bind)器中绑定(bind)所有属性的其他方法,我如何在此处使用数据注释方法(验证所需的属性等)而不产生大量开销?

最佳答案

查看 Derived Type ModelBinder in MvcContrib .这允许您通过“类型标记”过程将模型绑定(bind)到派生类型——当使用 RenderTypedPartial(...) 助手时,它会自动为您处理。 MvcContrib partials 维护跨 partials 的绑定(bind)状态,因此 Name/Id 前缀在深层对象图上得到正确维护。如果您使用模板等其他机制,那么您需要自己处理类型标记。这在文档页面中有解释。

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

模型绑定(bind)器也以不干扰数据注释/验证属性的方式解决了这个问题。在任何其他情况下,它们都会像您期望的那样工作。

关于asp.net-mvc-2 - 派生对象列表的 MVC2 Modelbinder,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2416395/

相关文章:

asp.net - Httphandler 可重用内存如何工作?

c# - 使用 FileResult 在 Asp.Net MVC 中下载任何类型的文件?

silverlight - 如何使用 Silverlight 和 MVVM 设计复合 View 和 View 模型?

c# - View Model Locator 的用途是什么?

asp.net-mvc - 当 ModelState 在 HttpPost 上无效时,ASP.NET MVC 自动绑定(bind)刷新的模型

asp.net-mvc - ASP.NET MVC - ID 字段的自定义模型绑定(bind)器

asp.net-mvc - 在 ASP MVC 中,如何向用户返回新 View 和文件?

jquery - Sql Server 2012 商店 pdf

android - 我是否需要手动清除ViewModel中的监听器变量以避免内存泄漏?

asp.net-mvc - 哪种模型绑定(bind)方法在 ASP.NET MVC 中具有最佳的单元测试语义?