Asp.net mvc 用于DynamicObject的MVC3 ModelBinder

Asp.net mvc 用于DynamicObject的MVC3 ModelBinder,asp.net-mvc,dynamic,asp.net-mvc-3,modelbinders,Asp.net Mvc,Dynamic,Asp.net Mvc 3,Modelbinders,我想看看是否有一个示例项目、教程、contrib分支或类似的东西详细介绍了如何为MVC3实现自定义ModelBinder以支持从DynamicObject继承的对象 我有一个域对象,它具有数据库定义的动态数量的属性,这些属性可以在运行时更改。为了更方便地使用对象,我让我的类实现继承自DynamicObject,并通过[dynamic]关键字将模型传递给视图 对象的所有动态属性都位于对象上名为“Attributes”的集合属性中。我想创建一系列编辑器模板来充实模型,理想情况下,我所要做的就是按照H

我想看看是否有一个示例项目、教程、contrib分支或类似的东西详细介绍了如何为MVC3实现自定义ModelBinder以支持从DynamicObject继承的对象

我有一个域对象,它具有数据库定义的动态数量的属性,这些属性可以在运行时更改。为了更方便地使用对象,我让我的类实现继承自DynamicObject,并通过[dynamic]关键字将模型传递给视图

对象的所有动态属性都位于对象上名为“Attributes”的集合属性中。我想创建一系列编辑器模板来充实模型,理想情况下,我所要做的就是按照Html.EditorForModel()进行调用,它将动态构建UI

问题是我没有太多的运气找到一个ModelBinder的实现,它能够检查DynamicObject并搭建出UI(我认为这是正确的术语?)


我发现IDictionary ModelBinder项目是在Roberto Hernandez(@hernandezrobert)在(源代码为)上制作的一个MVCConf视频中完成的,但我没有太多的运气将其改编成我的目的。我想知道是否有其他人试图创建一个能够完成我描述的工作的模型绑定器?或者可以给我指出正确的方向吗?

ModelBinder没有帮助生成视图,它们帮助将各种web源(表单、查询字符串等)的原始参数映射到动作方法所需的输入参数(特别是,如果输入参数是某种类而不是原语)


您要寻找的是一个如何生成视图模板的示例,这是我在dynamics中没有看到的。到目前为止,我所看到的用于常规视图模板生成的最佳资源是。如果您有办法(听起来像是这样)确定对象必须显示哪些属性,以及如何显示这些属性的元数据(例如textarea vs.input type=text等),那么您应该能够只按照w/Brad进行操作。

ModelBinder无助于生成视图,它们有助于将各种web源(表单、查询字符串等)的原始参数映射到操作方法所期望的输入参数(特别是,如果输入参数是某种类型的类而不是原语)


您要寻找的是一个如何生成视图模板的示例,这是我在dynamics中没有看到的。到目前为止,我所看到的用于常规视图模板生成的最佳资源是。如果您有办法(听起来像是这样)确定对象必须显示哪些属性,以及如何显示这些属性的元数据(例如textarea vs.input type=text等),然后你就可以跟着Brad走了。

我可以通过设置一个普通类作为我的Danamic对象的模型来解决我的问题,并让我的属性像这样存储

IList<DynamicProperty> DynamicProperties { get; set; }
IList DynamicProperties{get;set;}
我为DynamicObject创建了一个自定义视图,在该视图中,我调用了一个助手来显示DynamicProperties属性。这使MVC可以遍历集合并呈现每个属性。接下来,我有一个DynamicProperty视图,我使用它根据需要渲染属性。关键是,您还必须渲染包含该特定属性主键的隐藏字段。MVC3中的ModelBinder在这里的工作要比MVc2中好得多,因此它将数组索引作为字段名称的一部分呈现,以便每个属性的主键和值在提交时正确配对。您可能需要专门为提交的数据创建ViewModel,我在尝试使用“详细信息/编辑”视图中使用的同一模型类时遇到了问题,因为我只呈现了字段的子集,因此在回发时绑定到同一模型类时,字段丢失

您可以按正常方式处理保存,但对于这种类型的对象,在安全方面有一些注意事项。由于属性的数量是动态的,因此无法确保提交的字段数量与最初呈现的字段数量相同。用户可以为您可能已明确排除的属性插入自己的或更糟糕的外接程序字段。AntiForgeryToken可以防止此类提交发生在您的域之外,但随着jQuery等库提供的DOM操作的方便性和普及性,跨站点回发并不是唯一的问题,我不知道AntiForgeryToken是否能解释这一点,但我对此表示怀疑

事实证明,这种方法比尝试从DynamicObject继承、实现GetDynamicMemberNames以及制作自定义ModelBinder来使用wrap更容易


但是,我创建了一个自定义ModelMetaData和验证提供程序来处理这些方面,因为属性不是强类型的,所以MVC没有任何注释可供使用

我可以通过设置一个普通类作为我的Danamic对象的模型来解决我的问题,并将我的属性像这样存储

IList<DynamicProperty> DynamicProperties { get; set; }
IList DynamicProperties{get;set;}
我为DynamicObject创建了一个自定义视图,在该视图中,我调用了一个助手来显示DynamicProperties属性。这使MVC可以遍历集合并呈现每个属性。接下来,我有一个DynamicProperty视图,我使用它根据需要渲染属性。关键是,您还必须渲染包含该特定属性主键的隐藏字段。MVC3中的ModelBinder在这里的工作要比MVc2中好得多,因此它将数组索引作为字段名称的一部分呈现,以便每个属性的主键和值在提交时正确配对。您可能需要专门为提交的数据创建ViewModel,我在尝试使用detai中使用的相同模型类时遇到了问题