我正在尝试测试自定义模型绑定器。作为该过程的一部分,我创建了一个新的ModelBindingContext
以传递到自定义绑定器的BindModel
方法。问题是我需要将MetaData
的{{1}}属性设置为ModelBindingContext
对象,但老实说我不确定如何实例化该对象。
CachedDataAnnotationsModelMetadata
对象的签名是:
CachedDataAnnotationsModelMetadata
有没有人有一个原型和modelAccessor参数应该是什么的例子?
以下是非功能代码的片段。
public CachedDataAnnotationsModelMetadata(
CachedDataAnnotationsModelMetadata prototype,
Func<object> modelAccessor
)
我在网上发现了一些例子,人们正在与这个类进行交互,但没有实现它的具体例子。
提前致谢!
更新
想出 // Assemble
var formCollection = new List<KeyValuePair<string, string>> {
new KeyValuePair<string, string> ("SomeRequiredProperty", "SomeValue")
};
var valueProvider = new System.Web.Http.ValueProviders.Providers.NameValuePairsValueProvider(formCollection, null);
var metadata = new System.Web.Http.Metadata.Providers.CachedDataAnnotationsModelMetadata(????, ????)
var bindingContext = new ModelBindingContext {
ModelName = "ClaimsModelBinderInputModel",
ValueProvider = valueProvider,
ModelMetadata = metadata
};
var actionContext = new HttpActionContext();
var httpControllerContext = new HttpControllerContext();
httpControllerContext.Request = new HttpRequestMessage(HttpMethod.Post, "http://localhost/someUri");
actionContext.ControllerContext = httpControllerContext;
var cmb = new ClaimsModelBinder();
// Act
cmb.BindModel(actionContext, bindingContext);
// Assert...
,它只是用来延迟访问实际模型,直到访问模型属性。 https://github.com/ASP-NET-MVC/aspnetwebstack/blob/master/src/System.Web.Http/Metadata/ModelMetadata.cs#L103
如果有人可以提供帮助,我仍在努力提供原型对象。
答案 0 :(得分:0)
所以我最终完全回避了这个问题。
在检查继承模型后,我意识到在这种情况下,我可以使用DataAnnotationsModelMetadataProvider
而不是CachedDataAnnotationsModelMetadata
。后者并不需要设置缓存所需的参数,因为我不需要缓存来测试我正在测试的内容,所以标准DataAnnotationsModelMetadataProvider
就足够了。
我能够确定在阅读元数据命名空间的源代码后我可以采取不同的方法。
https://github.com/ASP-NET-MVC/aspnetwebstack/tree/master/src/System.Web.Http/Metadata
那就是说,如果其他人可以提供我原始问题的一些线索,我宁愿尽可能使用缓存的模型对象。