在前面数据绑定中我们曾提到一个FromUriAttribute类,它集成于ModelBinderAttribute,而ModelBinderAttribute又继承ParameterBindingAttribute,ParameterBindingAttribute类就一个空方法没什么实现,这里主要的实现在ModelBinderAttribute类里面,其主要方法是GetBinding,
public override HttpParameterBinding GetBinding(HttpParameterDescriptor parameter)
{
HttpConfiguration config = parameter.Configuration;
IModelBinder binder = GetModelBinder(config, parameter.ParameterType);
IEnumerable<ValueProviderFactory> valueProviderFactories = GetValueProviderFactories(config);
return new ModelBinderParameterBinding(parameter, binder, valueProviderFactories);
}
这里的GetModelBinder方法具体实现如下,
public IModelBinder GetModelBinder(HttpConfiguration configuration, Type modelType)
{
if (BinderType == null)
{
ModelBinderProvider provider = GetModelBinderProvider(configuration);
return provider.GetBinder(configuration, modelType);
}
// This may create a IModelBinder or a ModelBinderProvider
object value = GetOrInstantiate(configuration, BinderType);
Contract.Assert(value != null); // Activator would have thrown
IModelBinder binder = value as IModelBinder;
if (binder != null)
{
return binder;
}
else
{
ModelBinderProvider provider = value as ModelBinderProvider;
if (provider != null)
{
return provider.GetBinder(configuration, modelType);
}
}
Type required = typeof(IModelBinder);
throw Error.InvalidOperation(SRResources.ValueProviderFactory_Cannot_Create, required.Name, value.GetType().Name, required.Name);
}