它是提供给CreateMetadata方法的参数之一(如果扩展元数据支持,您将覆盖它).
ModelMetadata CreateMetadata(IEnumerable<Attribute> attributes,Type containerType,Func<object> modelAccessor,<<--THIS ONE Type modelType,string propertyName)
我假设它允许您访问模型对象本身(例如,用于基于模型值设置元数据),但是当我尝试使用它来转换到我的模型对象时,我只是为空.
Entity ent = (Entity)modelAccessor(); // = Null
如果我错过了,任何人都可以解释它的目的是什么?或者,如何正确使用它?
谢谢
解决方法
我们最初把它当做“对象模型”,而不是“Func modelAccessor”.我们不得不在MVC 2的船周期之后改变它.
目的是延迟检索模型的实际值,直到你知道你将需要它(即,直到你调用ModelMetadata.Model)为止.
它解决的问题实际上是一个相当深奥的一个相关的模型绑定一个LINQ to sql类,其中有一个外键引用.问题是,如果您检索到由外键关系表示的子对象(通常意味着该对象的延迟加载),则不再允许通过设置外键来选择新的子对象ID属性.在模型绑定时,建模绑定外键ID(而不是整个外键实体)是很常见的,但是如果我们检索到外键实体对象(为了填充ModelMetadata类),那么该绑定就不再是合法的,实际上是抛出一个例外.由于ModelMetadata用于模型的两个方向 – 通过模型绑定和出站,通过HTML生成 – 我们需要引入间接层,以保护您在两种情况下使用它的能力,而不会中断LINQ to sql的规则.