小编Lin*_*lon的帖子

MVC中的动态模型(非类)元数据提供程序

我们正在开发一个最终用户架构是动态的应用程序(我们有一个很好的商业案例 - 它不是静态模型可以轻松处理的东西).

我已经使用.NET DynamicObject类来允许从代码中轻松地处理这些动态模式对象,并期望这只能使用MVC模型元数据.然而,MVC元数据支持似乎受到了限制,因为它只处理每种类型定义的元数据 - 而不是每个对象,这将是这里的情况.

即使我挖掘并尝试实现我们自己的ModelMetadataProvider,似乎根本没有传入必要的信息 - GetMetadataForProperty方法特别成问题.实际上,我需要访问属性的父对象或容器对象,但传入的所有内容都是类型.

上面的内容主要来自ModelMetadata类中的FromStringExpression方法.这种方法实际上有容器(至少在这种情况下),但不通过它.当它在ViewData中找到有关存储(缓存?)的表达式的视图数据时,将执行此分支.如果失败,它会回退到通过ModelMetadata对象查找它 - 具有讽刺意味的可能对我有用.特别令人恼火的是FromStringExpression方法是静态的,所以我不能轻易地覆盖它的行为.

绝望中我曾考虑过试图遍历modelAccessor表达式,但这看起来像是一个充其量只是非常脆弱的kludge.

我已经广泛搜索了解决方案.许多人指出Brad Wilson 在非类模型上的谈话(http://channel9.msdn.com/Series/mvcConf/mvcConf-2011-Brad-Wilson-Advanced-MVC-3),但是如果你看一下实际的代码,你会看到TOO被绑定到TYPE而不是对象 - 换句话说,它不是非常有用.其他人已经指出http://fluentvalidation.codeplex.com/,但这似乎只适用于验证方面,我怀疑遇到了同样的问题(绑定到类型而不是对象)如上所述.

例如,我可能有一个包含一系列字段对象的字典对象.这看起来像(非常简化/简化示例):

public class Entity : DynamicObject, ICustomTypeDescriptor
{
    public Guid ID { get; set; }
    public Dictionary<string, EntityProp> Props { get; set; }

    ... DynamicObject and ICustomTypeDescriptor implementation to expose Props as dynamic properties against this Entity ...
}

public class EntityProp
{
    public string Name { get; set; }
    public object Value { get; set; } …
Run Code Online (Sandbox Code Playgroud)

c# asp.net-mvc

19
推荐指数
1
解决办法
2304
查看次数

标签 统计

asp.net-mvc ×1

c# ×1