我想要一个使用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并将其映射回域模型时会产生很多开销。
考虑在自定义模型绑定器中绑定所有属性的其他方法,如何在没有大量开销的情况下使用数据注释方法(验证所需的属性等)?
答案 0 :(得分:4)
查看Derived Type ModelBinder in MvcContrib。这允许您通过'typestamping'进程模拟绑定到派生类型 - 在使用RenderTypedPartial(...)帮助程序时会自动处理。 MvcContrib partials跨部分维护绑定状态,因此Name / Id前缀在深度对象图上得到适当维护。如果您使用其他机制,如模板,那么您需要自己处理类型印刷。这在文档页面中进行了解释。
回到您的问题以及如何使用ModelBinder解析派生类型,您可以在类似于WCF KnownTypeAttribute的机制中使用属性注册派生类型变体,或者您可以在启动时进行注册。无论哪种方式,这些变化都会被记录一次并保留用于性能考虑。
模型绑定器还以不干扰数据注释/验证属性的方式解决了这个问题。它们将在任何其他场景中按预期工作。