Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 2 什么是「;Func<;对象>;modelAccessor";MVC中的参数';s DataAnnotationsModelMetadataProvider?_Asp.net Mvc 2 - Fatal编程技术网

Asp.net mvc 2 什么是「;Func<;对象>;modelAccessor";MVC中的参数';s DataAnnotationsModelMetadataProvider?

Asp.net mvc 2 什么是「;Func<;对象>;modelAccessor";MVC中的参数';s DataAnnotationsModelMetadataProvider?,asp.net-mvc-2,Asp.net Mvc 2,它是提供给CreateMetadata方法的参数之一(如果扩展元数据支持,将覆盖该方法) 如果我理解错了,谁能解释一下它的目的是什么?或者,如何正确使用它 感谢modelAccessor参数并不指向对象的实例,而是一个访问对象某些属性的函数。“封装一个没有参数的方法,并返回一个由TResult参数指定类型的值。”例如,如果我们有以下类: public class Bar(){ [DisplayName("I am Foo.")] public string Foo{get;}

它是提供给CreateMetadata方法的参数之一(如果扩展元数据支持,将覆盖该方法)

如果我理解错了,谁能解释一下它的目的是什么?或者,如何正确使用它


感谢

modelAccessor参数并不指向对象的实例,而是一个访问对象某些属性的函数。“封装一个没有参数的方法,并返回一个由TResult参数指定类型的值。”例如,如果我们有以下类:

public class Bar(){

    [DisplayName("I am Foo.")]
    public string Foo{get;}
}
调用CreateMetaData时,它将为Foo属性创建元数据,modelAccessor将是一个返回Foo值的函数

我做了一些挖掘,找到了一种方法来获取对象的实例,但它需要使用反射。在我的示例中,可以执行以下操作来获取Bar类:

if (modelAccessor != null)
{
    //Use reflection to get the private field that holds the Bar object.
    FieldInfo container = modelAccessor.Target.GetType().GetField("container");

    //Invoke field on the modelAccessor target to get the instance of the Bar object.
    Bar myObject = (Bar)container.GetValue(modelAccessor.Target);
}
我只针对一个简单的测试用例运行了这个测试,因此您的里程数可能会有所不同,但希望这将有助于澄清发生了什么。

我们最初将其作为“对象模型”,而不是“Func modelAccessor”。我们不得不在MVC2的飞船周期后期进行更改

其目的是延迟检索模型的实际值,直到您知道需要它为止(也就是说,直到您调用ModelMetadata.model)


它解决的问题实际上是一个相当深奥的问题,涉及到针对具有外键引用的LINQ到SQL类的模型绑定。问题是,如果检索到由外键关系表示的子对象(通常意味着该对象的延迟加载),则不再允许通过设置外键ID属性来选择新的子对象。在模型绑定时,对外键ID(而不是整个外键实体)进行模型绑定是非常常见的,但是如果我们检索了外键实体对象(用于填充ModelMetadata类),那么该绑定将不再是合法的,并且实际上会引发异常。由于ModelMetadata用于模型的两个方向——入站、通过模型绑定和出站,通过HTML生成——我们需要引入间接层,以保护您在两种情况下使用它的能力,而不会中断LINQ to SQL的规则。

我刚刚玩过这个,当我呈现EditorForModel时,委托似乎为空。是否有任何方法可以获取正在呈现的对象,以便我可以拥有动态元数据?那么是否还有方法访问容器的对象实例?嗨,Brad,我意识到这是一个古老的答案,但从MVC 4开始,我似乎可以调用
modelacessor()
在派生的
CreateMetadata
方法中,获取模型对象的实例。有什么理由不这样做吗?特别是,我想根据模型的某些属性修改传递给
base.CreateMetadata
的属性列表。@TobyJ我也很想知道这一点。这个答案有更新吗?
public class Bar(){

    [DisplayName("I am Foo.")]
    public string Foo{get;}
}
if (modelAccessor != null)
{
    //Use reflection to get the private field that holds the Bar object.
    FieldInfo container = modelAccessor.Target.GetType().GetField("container");

    //Invoke field on the modelAccessor target to get the instance of the Bar object.
    Bar myObject = (Bar)container.GetValue(modelAccessor.Target);
}