我正在寻找是否有示例项目、教程、contrib分支或任何类似的东西,详细说明为MVC3实现自定义ModelBinder以支持从DynamicObject继承的对象。
我有一个域对象,它具有由数据库定义的动态数量的属性,这些属性可以在运行时更改。为了简化对象的使用,我使我的类实现继承自DynamicObject,并通过dynamic关键字将模型传递给视图。
对象的所有动态属性都在名为"Attributes“的对象上的集合属性中。我想创建一系列编辑器模板来充实模型,理想情况下,我所要做的就是按照Html.EditorForModel()的方式进行调用,它将动态构建UI。
问题是,我没有找到一个能够检查DynamicObject和搭建UI的ModelBinder实现(我认为这是正确的术语?)。
我发现IDictionary ModelBinder项目是在Roberto Hernandez (@hernandezrobert)在MVC3 Extensability ( http://mvcextensibility.codeplex.com/)上做的一个MVCConf视频中完成的,但我没有太多的机会让它适应我的目的。我想知道是否有人试图创建一个模型绑定器,能够做我所描述的?或者也许可以给我指个正确的方向?
发布于 2011-03-31 03:34:28
我能够通过设置一个普通的类作为我的DanamicObject的模型来解决我的情况,并像这样存储我的属性
IList<DynamicProperty> DynamicProperties { get; set; }我为DynamicObject创建了一个自定义视图,并在该视图中调用了一个帮助器来显示DynamicProperties属性。这让MVC遍历集合并呈现每个属性。接下来,我有一个用于根据需要呈现属性的DynamicProperty的视图。关键是您还必须呈现一个包含该特定属性的主键的隐藏字段。在这里,MVC3中的ModelBinder比MVc2中的要好得多,因此它会将数组索引呈现为字段名称的一部分,以便在提交时将每个属性的主键和值正确地配对。您可能希望专门为提交的数据创建一个ViewModel,当我尝试使用在详细信息/编辑视图中使用的相同模型类时,我遇到了问题,因为我只呈现了字段的一个子集,所以当我在回发时绑定到相同的模型类时,它们将丢失。
您可以像通常那样处理保存,但是对于这种类型的对象有一些安全方面的考虑。由于属性的数量是动态的,因此无法确保提交的字段数量与最初呈现的字段数量相同。用户可以为您可能显式排除的属性注入自己的字段,或者更糟糕的是,添加字段。AntiForgeryToken可以防止这种类型的提交发生在您的域外,但随着jQuery等库提供的DOM操作的简单性和普及性,跨站点回发并不是唯一需要考虑的问题,我不知道AntiForgeryToken是否会解释这一点,但我对此表示怀疑。
事实证明,这种方法比尝试从DynamicObject继承、实现GetDynamicMemberNames并创建一个自定义ModelBinder来使用它要容易得多。
然而,我创建了一个自定义的ModelMetaData和验证提供程序来处理这些方面,因为属性不是强类型的,所以MVC没有任何注释可用。
发布于 2011-03-02 02:55:08
ModelBinders无助于生成视图,它们帮助将来自各种web源(表单、查询字符串等)的原始参数映射到您的操作方法所期望的输入参数(特别是,如果您的输入参数是某种类型的类而不是原语)。
您正在寻找的是如何生成视图模板的示例,这是我在动态方面没有见过的。到目前为止,我所见过的用于生成常规视图模板的最佳资源是Brad Wilson's blog。如果你有办法(听起来像是这样)弄清楚对象必须显示什么属性,以及关于如何显示它们的元数据(例如,文本区域与输入type=text等),那么你应该能够只使用w/ Brad。
https://stackoverflow.com/questions/5158918
复制相似问题