Renaming IBinderMarker and friends to some more descriptive names.

This commit is contained in:
Ryan Nowak 2014-10-17 18:31:09 -07:00
parent d1c0213a10
commit 61f218c8e4
57 changed files with 277 additions and 279 deletions

View File

@ -20,7 +20,7 @@ namespace Microsoft.AspNet.Mvc.ApplicationModel
{ {
Action = other.Action; Action = other.Action;
Attributes = new List<object>(other.Attributes); Attributes = new List<object>(other.Attributes);
BinderMarker = other.BinderMarker; BinderMetadata = other.BinderMetadata;
IsOptional = other.IsOptional; IsOptional = other.IsOptional;
ParameterInfo = other.ParameterInfo; ParameterInfo = other.ParameterInfo;
ParameterName = other.ParameterName; ParameterName = other.ParameterName;
@ -30,7 +30,7 @@ namespace Microsoft.AspNet.Mvc.ApplicationModel
public List<object> Attributes { get; private set; } public List<object> Attributes { get; private set; }
public IBinderMarker BinderMarker { get; set; } public IBinderMetadata BinderMetadata { get; set; }
public bool IsOptional { get; set; } public bool IsOptional { get; set; }

View File

@ -44,7 +44,7 @@ namespace Microsoft.AspNet.Mvc
modelAccessor: null, modelAccessor: null,
methodInfo: actionDescriptor.MethodInfo, methodInfo: actionDescriptor.MethodInfo,
parameterName: parameter.Name, parameterName: parameter.Name,
binderMarker: parameter.BinderMarker); binderMetadata: parameter.BinderMetadata);
if (metadata != null) if (metadata != null)
{ {
@ -53,7 +53,7 @@ namespace Microsoft.AspNet.Mvc
} }
var bodyBoundParameterCount = parameterMetadata.Count( var bodyBoundParameterCount = parameterMetadata.Count(
modelMetadata => modelMetadata.Marker is IBodyBinderMarker); modelMetadata => modelMetadata.BinderMetadata is IFormatterBinderMetadata);
if (bodyBoundParameterCount > 1) if (bodyBoundParameterCount > 1)
{ {
throw new InvalidOperationException(Resources.MultipleBodyParametersAreNotAllowed); throw new InvalidOperationException(Resources.MultipleBodyParametersAreNotAllowed);

View File

@ -191,7 +191,7 @@ namespace Microsoft.AspNet.Mvc
var attributes = parameterInfo.GetCustomAttributes(inherit: true).OfType<object>().ToList(); var attributes = parameterInfo.GetCustomAttributes(inherit: true).OfType<object>().ToList();
parameterModel.Attributes.AddRange(attributes); parameterModel.Attributes.AddRange(attributes);
parameterModel.BinderMarker = attributes.OfType<IBinderMarker>().FirstOrDefault(); parameterModel.BinderMetadata = attributes.OfType<IBinderMetadata>().FirstOrDefault();
parameterModel.ParameterName = parameterInfo.Name; parameterModel.ParameterName = parameterInfo.Name;
parameterModel.IsOptional = parameterInfo.HasDefaultValue; parameterModel.IsOptional = parameterInfo.HasDefaultValue;
@ -510,7 +510,7 @@ namespace Microsoft.AspNet.Mvc
{ {
var parameterDescriptor = new ParameterDescriptor() var parameterDescriptor = new ParameterDescriptor()
{ {
BinderMarker = parameter.BinderMarker, BinderMetadata = parameter.BinderMetadata,
IsOptional = parameter.IsOptional, IsOptional = parameter.IsOptional,
Name = parameter.ParameterName, Name = parameter.ParameterName,
}; };

View File

@ -13,10 +13,10 @@ using Microsoft.Framework.OptionsModel;
namespace Microsoft.AspNet.Mvc namespace Microsoft.AspNet.Mvc
{ {
/// <summary> /// <summary>
/// Represents a model binder which understands <see cref="IBodyBinderMarker"/> and uses /// Represents a model binder which understands <see cref="IFormatterBinderMetadata"/> and uses
/// InputFomatters to bind the model to request's body. /// InputFomatters to bind the model to request's body.
/// </summary> /// </summary>
public class BodyModelBinder : MarkerAwareBinder<IBodyBinderMarker> public class BodyModelBinder : MetadataAwareBinder<IFormatterBinderMetadata>
{ {
private readonly ActionContext _actionContext; private readonly ActionContext _actionContext;
private readonly IInputFormatterSelector _formatterSelector; private readonly IInputFormatterSelector _formatterSelector;
@ -34,7 +34,9 @@ namespace Microsoft.AspNet.Mvc
_mvcOptions = mvcOptions; _mvcOptions = mvcOptions;
} }
protected override async Task<bool> BindAsync(ModelBindingContext bindingContext, IBodyBinderMarker marker) protected override async Task<bool> BindAsync(
ModelBindingContext bindingContext,
IFormatterBinderMetadata metadata)
{ {
var formatterContext = new InputFormatterContext(_actionContext, bindingContext.ModelType); var formatterContext = new InputFormatterContext(_actionContext, bindingContext.ModelType);
var formatter = _formatterSelector.SelectFormatter(formatterContext); var formatter = _formatterSelector.SelectFormatter(formatterContext);

View File

@ -2,7 +2,7 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System; using System;
using System.Reflection; using System.Collections.Generic;
using Microsoft.AspNet.Mvc.ModelBinding; using Microsoft.AspNet.Mvc.ModelBinding;
namespace Microsoft.AspNet.Mvc namespace Microsoft.AspNet.Mvc
@ -17,7 +17,7 @@ namespace Microsoft.AspNet.Mvc
public ParameterBindingInfo ParameterBindingInfo { get; set; } public ParameterBindingInfo ParameterBindingInfo { get; set; }
public IBinderMarker BinderMarker { get; set; } public IBinderMetadata BinderMetadata { get; set; }
public BodyParameterInfo BodyParameterInfo { get; set; } public BodyParameterInfo BodyParameterInfo { get; set; }
} }

View File

@ -1,13 +0,0 @@
// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
namespace Microsoft.AspNet.Mvc.ModelBinding
{
/// <summary>
/// Represents a marker used to identify a binder which can bind route data to a model.
/// </summary>
public interface IRouteDataMarker : IValueBinderMarker
{
}
}

View File

@ -1,12 +0,0 @@
// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
namespace Microsoft.AspNet.Mvc.ModelBinding
{
/// <summary>
/// Represents a binder marker which identifies a binder which is based on a value provider.
/// </summary>
public interface IValueBinderMarker : IBinderMarker
{
}
}

View File

@ -11,7 +11,7 @@ namespace Microsoft.AspNet.Mvc
/// they are bound from the body of the incoming request. /// they are bound from the body of the incoming request.
/// </summary> /// </summary>
[AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false, Inherited = true)] [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false, Inherited = true)]
public class FromBodyAttribute : Attribute, IBodyBinderMarker public class FromBodyAttribute : Attribute, IFormatterBinderMetadata
{ {
} }
} }

View File

@ -11,7 +11,7 @@ namespace Microsoft.AspNet.Mvc
/// they will be bound using form data of the incoming request. /// they will be bound using form data of the incoming request.
/// </summary> /// </summary>
[AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false, Inherited = true)] [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false, Inherited = true)]
public class FromFormAttribute : Attribute, IFormDataMarker public class FromFormAttribute : Attribute, IFormDataValueProviderMetadata
{ {
} }
} }

View File

@ -11,7 +11,7 @@ namespace Microsoft.AspNet.Mvc
/// they will be bound using query data of the incoming request. /// they will be bound using query data of the incoming request.
/// </summary> /// </summary>
[AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false, Inherited = true)] [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false, Inherited = true)]
public class FromQueryAttribute : Attribute, IQueryBinderMarker public class FromQueryAttribute : Attribute, IQueryValueProviderMetadata
{ {
} }
} }

View File

@ -11,7 +11,7 @@ namespace Microsoft.AspNet.Mvc
/// they will be bound using route data of the incoming request. /// they will be bound using route data of the incoming request.
/// </summary> /// </summary>
[AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false, Inherited = true)] [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false, Inherited = true)]
public class FromRouteAttribute : Attribute, IRouteDataMarker public class FromRouteAttribute : Attribute, IRouteDataValueProviderMetadata
{ {
} }
} }

View File

@ -1,13 +1,12 @@
// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
namespace Microsoft.AspNet.Mvc.ModelBinding namespace Microsoft.AspNet.Mvc.ModelBinding
{ {
/// <summary> /// <summary>
/// Represents a marker used to identify a binder which can bind request body to a model. /// Interface for metadata related to model binders.
/// </summary> /// </summary>
public interface IBodyBinderMarker : IBinderMarker public interface IBinderMetadata
{ {
} }
} }

View File

@ -1,13 +1,12 @@
// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
namespace Microsoft.AspNet.Mvc.ModelBinding namespace Microsoft.AspNet.Mvc.ModelBinding
{ {
/// <summary> /// <summary>
/// Represents a marker used to identify a binder which can bind query data to a model. /// Metadata interface that indicates model binding should use only form data value providers.
/// </summary> /// </summary>
public interface IQueryBinderMarker : IValueBinderMarker public interface IFormDataValueProviderMetadata : IValueProviderMetadata
{ {
} }
} }

View File

@ -1,13 +1,12 @@
// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
namespace Microsoft.AspNet.Mvc.ModelBinding namespace Microsoft.AspNet.Mvc.ModelBinding
{ {
/// <summary> /// <summary>
/// Represents a marker used to identify a binder which can bind form data to a model. /// Metadata interface that indicates model binding should be performed by an input formatter.
/// </summary> /// </summary>
public interface IFormDataMarker : IValueBinderMarker public interface IFormatterBinderMetadata : IBinderMetadata
{ {
} }
} }

View File

@ -0,0 +1,12 @@
// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
namespace Microsoft.AspNet.Mvc.ModelBinding
{
/// <summary>
/// Metadata interface that indicates model binding should use only query string value providers.
/// </summary>
public interface IQueryValueProviderMetadata : IValueProviderMetadata
{
}
}

View File

@ -0,0 +1,12 @@
// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
namespace Microsoft.AspNet.Mvc.ModelBinding
{
/// <summary>
/// Metadata interface that indicates model binding should use only route data value providers.
/// </summary>
public interface IRouteDataValueProviderMetadata : IValueProviderMetadata
{
}
}

View File

@ -1,14 +1,12 @@
// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
namespace Microsoft.AspNet.Mvc.ModelBinding namespace Microsoft.AspNet.Mvc.ModelBinding
{ {
/// <summary> /// <summary>
/// Represents a marker used to identify a particular binder applies to a model. /// Interface for metadata related to value providers.
/// </summary> /// </summary>
public interface IBinderMarker public interface IValueProviderMetadata : IBinderMetadata
{ {
} }
} }

View File

@ -145,13 +145,13 @@ namespace Microsoft.AspNet.Mvc.ModelBinding
} }
// look at the value providers and see if they need to be restricted. // look at the value providers and see if they need to be restricted.
var marker = oldBindingContext.ModelMetadata.Marker as IValueBinderMarker; var metadata = oldBindingContext.ModelMetadata.BinderMetadata as IValueProviderMetadata;
if (marker != null) if (metadata != null)
{ {
var valueProvider = oldBindingContext.ValueProvider as IMarkerAwareValueProvider; var valueProvider = oldBindingContext.ValueProvider as IMetadataAwareValueProvider;
if (valueProvider != null) if (valueProvider != null)
{ {
newBindingContext.ValueProvider = valueProvider.Filter(marker); newBindingContext.ValueProvider = valueProvider.Filter(metadata);
} }
} }

View File

@ -4,9 +4,9 @@
namespace Microsoft.AspNet.Mvc.ModelBinding namespace Microsoft.AspNet.Mvc.ModelBinding
{ {
/// <summary> /// <summary>
/// An <see cref="IModelBinder"/> which is aware of <see cref="IBinderMarker"/>. /// An <see cref="IModelBinder"/> which is aware of <see cref="IBinderMetadata"/>.
/// </summary> /// </summary>
public interface IMarkerAwareBinder : IModelBinder public interface IMetadataAwareBinder : IModelBinder
{ {
} }
} }

View File

@ -6,27 +6,27 @@ using System.Threading.Tasks;
namespace Microsoft.AspNet.Mvc.ModelBinding namespace Microsoft.AspNet.Mvc.ModelBinding
{ {
/// <summary> /// <summary>
/// Represents an <see cref="IMarkerAwareBinder"/> which can select itself based on the /// Represents an <see cref="IMetadataAwareBinder"/> which can select itself based on the
/// <typeparamref name="TBinderMarker"/>. /// <typeparamref name="TBinderMetadata"/>.
/// </summary> /// </summary>
/// <typeparam name="TBinderMarker">Represents a type implementing <see cref="IBinderMarker"/></typeparam> /// <typeparam name="TBinderMetadata">Represents a type implementing <see cref="IBinderMetadata"/></typeparam>
public abstract class MarkerAwareBinder<TBinderMarker> : IMarkerAwareBinder public abstract class MetadataAwareBinder<TBinderMetadata> : IMetadataAwareBinder
where TBinderMarker : IBinderMarker where TBinderMetadata : IBinderMetadata
{ {
/// <summary> /// <summary>
/// Async function which does the actual binding to bind to a particular model. /// Async function which does the actual binding to bind to a particular model.
/// </summary> /// </summary>
/// <param name="bindingContext">The binding context which has the object to be bound.</param> /// <param name="bindingContext">The binding context which has the object to be bound.</param>
/// <param name="marker">The <see cref="IBinderMarker"/> associated with the current binder.</param> /// <param name="metadata">The <see cref="IBinderMetadata"/> associated with the current binder.</param>
/// <returns>A Task with a bool implying the success or failure of the operation.</returns> /// <returns>A Task with a bool implying the success or failure of the operation.</returns>
protected abstract Task<bool> BindAsync(ModelBindingContext bindingContext, TBinderMarker marker); protected abstract Task<bool> BindAsync(ModelBindingContext bindingContext, TBinderMetadata metadata);
public Task<bool> BindModelAsync(ModelBindingContext context) public Task<bool> BindModelAsync(ModelBindingContext context)
{ {
if (context.ModelMetadata.Marker is TBinderMarker) if (context.ModelMetadata.BinderMetadata is TBinderMetadata)
{ {
var marker = (TBinderMarker)context.ModelMetadata.Marker; var metadata = (TBinderMetadata)context.ModelMetadata.BinderMetadata;
return BindAsync(context, marker); return BindAsync(context, metadata);
} }
return Task.FromResult(false); return Task.FromResult(false);

View File

@ -50,7 +50,7 @@ namespace Microsoft.AspNet.Mvc.ModelBinding
Func<object> modelAccessor, Func<object> modelAccessor,
[NotNull] MethodInfo methodInfo, [NotNull] MethodInfo methodInfo,
[NotNull] string parameterName, [NotNull] string parameterName,
IBinderMarker binderMarker) IBinderMetadata binderMetadata)
{ {
var parameter = methodInfo.GetParameters().FirstOrDefault( var parameter = methodInfo.GetParameters().FirstOrDefault(
param => StringComparer.Ordinal.Equals(param.Name, parameterName)); param => StringComparer.Ordinal.Equals(param.Name, parameterName));
@ -60,7 +60,7 @@ namespace Microsoft.AspNet.Mvc.ModelBinding
throw new ArgumentException(message, nameof(parameterName)); throw new ArgumentException(message, nameof(parameterName));
} }
return GetMetadataForParameterCore(modelAccessor, parameterName, parameter, binderMarker); return GetMetadataForParameterCore(modelAccessor, parameterName, parameter, binderMetadata);
} }
// Override for creating the prototype metadata (without the accessor) // Override for creating the prototype metadata (without the accessor)
@ -75,13 +75,14 @@ namespace Microsoft.AspNet.Mvc.ModelBinding
private ModelMetadata GetMetadataForParameterCore(Func<object> modelAccessor, private ModelMetadata GetMetadataForParameterCore(Func<object> modelAccessor,
string parameterName, string parameterName,
ParameterInfo parameter, ParameterInfo parameter,
IBinderMarker binderMarker) IBinderMetadata binderMetadata)
{ {
var parameterInfo = var parameterInfo =
CreateParameterInfo(parameter.ParameterType, CreateParameterInfo(parameter.ParameterType,
parameter.GetCustomAttributes(), parameter.GetCustomAttributes(),
parameterName, parameterName,
binderMarker); binderMetadata);
return CreateMetadataFromPrototype(parameterInfo.Prototype, modelAccessor); return CreateMetadataFromPrototype(parameterInfo.Prototype, modelAccessor);
} }
@ -172,19 +173,19 @@ namespace Microsoft.AspNet.Mvc.ModelBinding
Type parameterType, Type parameterType,
IEnumerable<Attribute> attributes, IEnumerable<Attribute> attributes,
string parameterName, string parameterName,
IBinderMarker binderMarker) IBinderMetadata binderMetadata)
{ {
var metadataProtoType = CreateMetadataPrototype(attributes: attributes, var metadataProtoType = CreateMetadataPrototype(attributes: attributes,
containerType: null, containerType: null,
modelType: parameterType, modelType: parameterType,
propertyName: parameterName); propertyName: parameterName);
if (binderMarker != null) if (binderMetadata != null)
{ {
metadataProtoType.Marker = binderMarker; metadataProtoType.BinderMetadata = binderMetadata;
} }
var nameProvider = binderMarker as IModelNameProvider; var nameProvider = binderMetadata as IModelNameProvider;
if (nameProvider != null && nameProvider.Name != null) if (nameProvider != null && nameProvider.Name != null)
{ {
metadataProtoType.ModelName = nameProvider.Name; metadataProtoType.ModelName = nameProvider.Name;

View File

@ -33,7 +33,7 @@ namespace Microsoft.AspNet.Mvc.ModelBinding
propertyName, propertyName,
new CachedDataAnnotationsMetadataAttributes(attributes)) new CachedDataAnnotationsMetadataAttributes(attributes))
{ {
Marker = attributes.OfType<IBinderMarker>().FirstOrDefault(); BinderMetadata = attributes.OfType<IBinderMetadata>().FirstOrDefault();
var modelNameProvider = attributes.OfType<IModelNameProvider>().FirstOrDefault(); var modelNameProvider = attributes.OfType<IModelNameProvider>().FirstOrDefault();
ModelName = modelNameProvider?.Name; ModelName = modelNameProvider?.Name;

View File

@ -55,7 +55,7 @@ namespace Microsoft.AspNet.Mvc.ModelBinding
{ {
CacheKey = prototype.CacheKey; CacheKey = prototype.CacheKey;
PrototypeCache = prototype.PrototypeCache; PrototypeCache = prototype.PrototypeCache;
Marker = prototype.Marker; BinderMetadata = prototype.BinderMetadata;
IncludedProperties = prototype.IncludedProperties; IncludedProperties = prototype.IncludedProperties;
ExcludedProperties = prototype.ExcludedProperties; ExcludedProperties = prototype.ExcludedProperties;
ModelName = prototype.ModelName; ModelName = prototype.ModelName;

View File

@ -19,6 +19,6 @@ namespace Microsoft.AspNet.Mvc.ModelBinding
Func<object> modelAccessor, Func<object> modelAccessor,
[NotNull] MethodInfo methodInfo, [NotNull] MethodInfo methodInfo,
[NotNull] string parameterName, [NotNull] string parameterName,
IBinderMarker binderMarker); IBinderMetadata binderMetadata);
} }
} }

View File

@ -63,9 +63,9 @@ namespace Microsoft.AspNet.Mvc.ModelBinding
public IReadOnlyList<string> ExcludedProperties { get; set; } public IReadOnlyList<string> ExcludedProperties { get; set; }
/// <summary> /// <summary>
/// Gets or sets a binder marker for this model. /// Gets or sets a binder metadata for this model.
/// </summary> /// </summary>
public IBinderMarker Marker { get; set; } public IBinderMetadata BinderMetadata { get; set; }
public Type ContainerType public Type ContainerType
{ {

View File

@ -9,7 +9,7 @@ using System.Threading.Tasks;
namespace Microsoft.AspNet.Mvc.ModelBinding namespace Microsoft.AspNet.Mvc.ModelBinding
{ {
public class CompositeValueProvider : Collection<IValueProvider>, IEnumerableValueProvider, IMarkerAwareValueProvider public class CompositeValueProvider : Collection<IValueProvider>, IEnumerableValueProvider, IMetadataAwareValueProvider
{ {
public CompositeValueProvider() public CompositeValueProvider()
: base() : base()
@ -80,12 +80,12 @@ namespace Microsoft.AspNet.Mvc.ModelBinding
base.SetItem(index, item); base.SetItem(index, item);
} }
public IValueProvider Filter(IValueBinderMarker valueBinderMarker) public IValueProvider Filter(IValueProviderMetadata valueBinderMetadata)
{ {
var filteredValueProviders = new List<IValueProvider>(); var filteredValueProviders = new List<IValueProvider>();
foreach (var valueProvider in this.OfType<IMarkerAwareValueProvider>()) foreach (var valueProvider in this.OfType<IMetadataAwareValueProvider>())
{ {
var result = valueProvider.Filter(valueBinderMarker); var result = valueProvider.Filter(valueBinderMetadata);
if (result != null) if (result != null)
{ {
filteredValueProviders.Add(result); filteredValueProviders.Add(result);

View File

@ -8,8 +8,8 @@ using Microsoft.AspNet.Mvc.ModelBinding.Internal;
namespace Microsoft.AspNet.Mvc.ModelBinding namespace Microsoft.AspNet.Mvc.ModelBinding
{ {
public class DictionaryBasedValueProvider<TBinderMarker> : MarkerAwareValueProvider<TBinderMarker> public class DictionaryBasedValueProvider<TBinderMetadata> : MetadataAwareValueProvider<TBinderMetadata>
where TBinderMarker : IValueBinderMarker where TBinderMetadata : IValueProviderMetadata
{ {
private readonly IDictionary<string, object> _values; private readonly IDictionary<string, object> _values;
private PrefixContainer _prefixContainer; private PrefixContainer _prefixContainer;

View File

@ -20,7 +20,9 @@ namespace Microsoft.AspNet.Mvc.ModelBinding
if (IsSupportedContentType(request)) if (IsSupportedContentType(request))
{ {
var culture = GetCultureInfo(request); var culture = GetCultureInfo(request);
return new ReadableStringCollectionValueProvider<IFormDataMarker>(() => request.GetFormAsync(), culture); return new ReadableStringCollectionValueProvider<IFormDataValueProviderMetadata>(
() => request.GetFormAsync(),
culture);
} }
return null; return null;

View File

@ -4,15 +4,15 @@
namespace Microsoft.AspNet.Mvc.ModelBinding namespace Microsoft.AspNet.Mvc.ModelBinding
{ {
/// <summary> /// <summary>
/// A value provider which is aware of <see cref="IValueBinderMarker"/>. /// A value provider which is aware of <see cref="IValueProviderMetadata"/>.
/// </summary> /// </summary>
public interface IMarkerAwareValueProvider : IValueProvider public interface IMetadataAwareValueProvider : IValueProvider
{ {
/// <summary> /// <summary>
/// Filters the value provider based on <paramref name="valueBinderMarker"/>. /// Filters the value provider based on <paramref name="metadata"/>.
/// </summary> /// </summary>
/// <param name="valueBinderMarker">The <see cref="IValueBinderMarker"/> associated with a model.</param> /// <param name="metadata">The <see cref="IValueProviderMetadata"/> associated with a model.</param>
/// <returns>The filtered value provider.</returns> /// <returns>The filtered value provider.</returns>
IValueProvider Filter([NotNull] IValueBinderMarker valueBinderMarker); IValueProvider Filter([NotNull] IValueProviderMetadata metadata);
} }
} }

View File

@ -7,20 +7,20 @@ using System.Threading.Tasks;
namespace Microsoft.AspNet.Mvc.ModelBinding namespace Microsoft.AspNet.Mvc.ModelBinding
{ {
/// <summary> /// <summary>
/// A <see cref="IMarkerAwareValueProvider"/> value provider which can filter /// A <see cref="IMetadataAwareValueProvider"/> value provider which can filter
/// based on <see cref="IValueBinderMarker"/>. /// based on <see cref="IValueProviderMetadata"/>.
/// </summary> /// </summary>
/// <typeparam name="TBinderMarker">Represents a type implementing <see cref="IValueBinderMarker"/></typeparam> /// <typeparam name="TBinderMetadata">Represents a type implementing <see cref="IValueProviderMetadata"/></typeparam>
public abstract class MarkerAwareValueProvider<TBinderMarker> : IMarkerAwareValueProvider public abstract class MetadataAwareValueProvider<TBinderMetadata> : IMetadataAwareValueProvider
where TBinderMarker : IValueBinderMarker where TBinderMetadata : IValueProviderMetadata
{ {
public abstract Task<bool> ContainsPrefixAsync(string prefix); public abstract Task<bool> ContainsPrefixAsync(string prefix);
public abstract Task<ValueProviderResult> GetValueAsync(string key); public abstract Task<ValueProviderResult> GetValueAsync(string key);
public virtual IValueProvider Filter(IValueBinderMarker valueBinderMarker) public virtual IValueProvider Filter(IValueProviderMetadata valueBinderMetadata)
{ {
if (valueBinderMarker is TBinderMarker) if (valueBinderMetadata is TBinderMetadata)
{ {
return this; return this;
} }

View File

@ -18,13 +18,13 @@ namespace Microsoft.AspNet.Mvc.ModelBinding
if (!storage.TryGetValue(_cacheKey, out value)) if (!storage.TryGetValue(_cacheKey, out value))
{ {
var queryCollection = context.HttpContext.Request.Query; var queryCollection = context.HttpContext.Request.Query;
provider = new ReadableStringCollectionValueProvider<IQueryBinderMarker>(queryCollection, provider = new ReadableStringCollectionValueProvider<IQueryValueProviderMetadata>(queryCollection,
CultureInfo.InvariantCulture); CultureInfo.InvariantCulture);
storage[_cacheKey] = provider; storage[_cacheKey] = provider;
} }
else else
{ {
provider = (ReadableStringCollectionValueProvider<IQueryBinderMarker>)value; provider = (ReadableStringCollectionValueProvider<IQueryValueProviderMetadata>)value;
} }
return provider; return provider;
} }

View File

@ -11,9 +11,9 @@ using Microsoft.AspNet.Mvc.ModelBinding.Internal;
namespace Microsoft.AspNet.Mvc.ModelBinding namespace Microsoft.AspNet.Mvc.ModelBinding
{ {
public class ReadableStringCollectionValueProvider<TBinderMarker> : public class ReadableStringCollectionValueProvider<TBinderMetadata> :
MarkerAwareValueProvider<TBinderMarker>, IEnumerableValueProvider MetadataAwareValueProvider<TBinderMetadata>, IEnumerableValueProvider
where TBinderMarker : IValueBinderMarker where TBinderMetadata : IValueProviderMetadata
{ {
private readonly CultureInfo _culture; private readonly CultureInfo _culture;
private PrefixContainer _prefixContainer; private PrefixContainer _prefixContainer;

View File

@ -7,7 +7,7 @@ namespace Microsoft.AspNet.Mvc.ModelBinding
{ {
public IValueProvider GetValueProvider([NotNull] ValueProviderFactoryContext context) public IValueProvider GetValueProvider([NotNull] ValueProviderFactoryContext context)
{ {
return new DictionaryBasedValueProvider<IRouteDataMarker>(context.RouteValues); return new DictionaryBasedValueProvider<IRouteDataValueProviderMetadata>(context.RouteValues);
} }
} }
} }

View File

@ -32,19 +32,19 @@ namespace Microsoft.AspNet.Mvc.WebApiCompatShim
{ {
foreach (var parameter in action.Parameters) foreach (var parameter in action.Parameters)
{ {
if (parameter.BinderMarker != null) if (parameter.BinderMetadata is IBinderMetadata)
{ {
// This has a binding behavior configured, just leave it alone. // This has a binding behavior configured, just leave it alone.
} }
else if (ValueProviderResult.CanConvertFromString(parameter.ParameterInfo.ParameterType)) else if (ValueProviderResult.CanConvertFromString(parameter.ParameterInfo.ParameterType))
{ {
// Simple types are by-default from the URI. // Simple types are by-default from the URI.
parameter.BinderMarker = new FromUriAttribute(); parameter.BinderMetadata = new FromUriAttribute();
} }
else else
{ {
// Complex types are by-default from the body. // Complex types are by-default from the body.
parameter.BinderMarker = new FromBodyAttribute(); parameter.BinderMetadata = new FromBodyAttribute();
} }
} }
} }

View File

@ -91,11 +91,13 @@ namespace Microsoft.AspNet.Mvc.WebApiCompatShim
foreach (var parameter in candidate.Action.Parameters) foreach (var parameter in candidate.Action.Parameters)
{ {
// We only consider parameters that are bound from the URL. // We only consider parameters that are bound from the URL.
if ((parameter.BinderMarker is IRouteDataMarker || parameter.BinderMarker is IQueryBinderMarker) && if ((parameter.BinderMetadata is IRouteDataValueProviderMetadata ||
parameter.BinderMetadata is IQueryValueProviderMetadata) &&
!parameter.IsOptional && !parameter.IsOptional &&
ValueProviderResult.CanConvertFromString(parameter.ParameterBindingInfo.ParameterType)) ValueProviderResult.CanConvertFromString(parameter.ParameterBindingInfo.ParameterType))
{ {
var prefix = (parameter.BinderMarker as IModelNameProvider).Name ?? parameter.Name; var nameProvider = parameter.BinderMetadata as IModelNameProvider;
var prefix = nameProvider?.Name ?? parameter.Name;
parameters.Add(new OverloadedParameter() parameters.Add(new OverloadedParameter()
{ {

View File

@ -10,8 +10,13 @@ namespace System.Web.Http
/// An attribute that specifies that the value can be bound from the query string or route data. /// An attribute that specifies that the value can be bound from the query string or route data.
/// </summary> /// </summary>
[AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false, Inherited = true)] [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false, Inherited = true)]
public class FromUriAttribute : Attribute, IQueryBinderMarker, IRouteDataMarker, IModelNameProvider public class FromUriAttribute :
Attribute,
IQueryValueProviderMetadata,
IRouteDataValueProviderMetadata,
IModelNameProvider
{ {
/// <inheritdoc />
public string Name { get; set; } public string Name { get; set; }
} }
} }

View File

@ -9,7 +9,7 @@ namespace System.Web.Http
/// An attribute that specifies that the value can be bound by a model binder. /// An attribute that specifies that the value can be bound by a model binder.
/// </summary> /// </summary>
[AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false, Inherited = true)] [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false, Inherited = true)]
public class ModelBinderAttribute : Attribute, IBinderMarker public class ModelBinderAttribute : Attribute, IBinderMetadata
{ {
} }
} }

View File

@ -3,6 +3,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using Microsoft.AspNet.Mvc.ModelBinding;
using Xunit; using Xunit;
namespace Microsoft.AspNet.Mvc.ApplicationModel namespace Microsoft.AspNet.Mvc.ApplicationModel
@ -17,7 +18,7 @@ namespace Microsoft.AspNet.Mvc.ApplicationModel
parameter.Action = new ActionModel(typeof(TestController).GetMethod("Edit")); parameter.Action = new ActionModel(typeof(TestController).GetMethod("Edit"));
parameter.Attributes.Add(new FromBodyAttribute()); parameter.Attributes.Add(new FromBodyAttribute());
parameter.BinderMarker = new FromBodyAttribute(); parameter.BinderMetadata = (IBinderMetadata)parameter.Attributes[0];
parameter.IsOptional = true; parameter.IsOptional = true;
parameter.ParameterName = "id"; parameter.ParameterName = "id";

View File

@ -31,7 +31,7 @@ namespace Microsoft.AspNet.Mvc
.Verifiable(); .Verifiable();
var bindingContext = GetBindingContext(typeof(Person), inputFormatter: mockInputFormatter.Object); var bindingContext = GetBindingContext(typeof(Person), inputFormatter: mockInputFormatter.Object);
bindingContext.ModelMetadata.Marker = Mock.Of<IBodyBinderMarker>(); bindingContext.ModelMetadata.BinderMetadata = Mock.Of<IFormatterBinderMetadata>();
var binder = GetBodyBinder(mockInputFormatter.Object, mockValidator.Object, null); var binder = GetBodyBinder(mockInputFormatter.Object, mockValidator.Object, null);
@ -48,7 +48,7 @@ namespace Microsoft.AspNet.Mvc
{ {
// Arrange // Arrange
var bindingContext = GetBindingContext(typeof(Person), inputFormatter: null); var bindingContext = GetBindingContext(typeof(Person), inputFormatter: null);
bindingContext.ModelMetadata.Marker = Mock.Of<IBodyBinderMarker>(); bindingContext.ModelMetadata.BinderMetadata = Mock.Of<IFormatterBinderMetadata>();
var binder = bindingContext.ModelBinder; var binder = bindingContext.ModelBinder;
// Act // Act
@ -56,7 +56,7 @@ namespace Microsoft.AspNet.Mvc
// Assert // Assert
// Returns true because it understands the marker. // Returns true because it understands the metadata type.
Assert.True(binderResult); Assert.True(binderResult);
Assert.Null(bindingContext.Model); Assert.Null(bindingContext.Model);
Assert.True(bindingContext.ModelState.ContainsKey("someName")); Assert.True(bindingContext.ModelState.ContainsKey("someName"));
@ -65,19 +65,19 @@ namespace Microsoft.AspNet.Mvc
[Theory] [Theory]
[InlineData(true)] [InlineData(true)]
[InlineData(false)] [InlineData(false)]
public async Task BindModel_IsMarkerAware(bool useBodyMarker) public async Task BindModel_IsMetadataAware(bool useBody)
{ {
// Arrange // Arrange
var bindingContext = GetBindingContext(typeof(Person), inputFormatter: null); var bindingContext = GetBindingContext(typeof(Person), inputFormatter: null);
bindingContext.ModelMetadata.Marker = useBodyMarker ? Mock.Of<IBodyBinderMarker>() : bindingContext.ModelMetadata.BinderMetadata = useBody ? Mock.Of<IFormatterBinderMetadata>() :
Mock.Of<IBinderMarker>(); Mock.Of<IBinderMetadata>();
var binder = bindingContext.ModelBinder; var binder = bindingContext.ModelBinder;
// Act // Act
var binderResult = await binder.BindModelAsync(bindingContext); var binderResult = await binder.BindModelAsync(bindingContext);
// Assert // Assert
Assert.Equal(useBodyMarker, binderResult); Assert.Equal(useBody, binderResult);
} }
private static ModelBindingContext GetBindingContext(Type modelType, IInputFormatter inputFormatter) private static ModelBindingContext GetBindingContext(Type modelType, IInputFormatter inputFormatter)

View File

@ -60,7 +60,7 @@ namespace Microsoft.AspNet.Mvc.Core.Test
var modelMetadata = metadataProvider.GetMetadataForParameter(modelAccessor: null, var modelMetadata = metadataProvider.GetMetadataForParameter(modelAccessor: null,
methodInfo: methodInfo, methodInfo: methodInfo,
parameterName: "foo", parameterName: "foo",
binderMarker: null); binderMetadata: null);
var actionBindingContext = new ActionBindingContext(actionContext, var actionBindingContext = new ActionBindingContext(actionContext,
@ -95,7 +95,7 @@ namespace Microsoft.AspNet.Mvc.Core.Test
var modelMetadata = metadataProvider.GetMetadataForParameter(modelAccessor: null, var modelMetadata = metadataProvider.GetMetadataForParameter(modelAccessor: null,
methodInfo: methodInfo, methodInfo: methodInfo,
parameterName: "foo1", parameterName: "foo1",
binderMarker: null); binderMetadata: null);
var actionBindingContext = new ActionBindingContext(actionContext, var actionBindingContext = new ActionBindingContext(actionContext,
@ -266,10 +266,10 @@ namespace Microsoft.AspNet.Mvc.Core.Test
{ {
public string UnmarkedProperty { get; set; } public string UnmarkedProperty { get; set; }
[NonValueBinderMarker] [NonValueProviderBinderMetadata]
public string NonValueBinderMarkedProperty { get; set; } public string NonValueBinderMarkedProperty { get; set; }
[ValueBinderMarker] [ValueProviderMetadata]
public string ValueBinderMarkedProperty { get; set; } public string ValueBinderMarkedProperty { get; set; }
public Person ActionWithBodyParam([FromBody] Person bodyParam) public Person ActionWithBodyParam([FromBody] Person bodyParam)
@ -284,11 +284,11 @@ namespace Microsoft.AspNet.Mvc.Core.Test
} }
private class NonValueBinderMarkerAttribute : Attribute, IBinderMarker private class NonValueProviderBinderMetadataAttribute : Attribute, IBinderMetadata
{ {
} }
private class ValueBinderMarkerAttribute : Attribute, IValueBinderMarker private class ValueProviderMetadataAttribute : Attribute, IValueProviderMetadata
{ {
} }
} }

View File

@ -67,7 +67,7 @@ namespace Microsoft.AspNet.Mvc.Core.Test
{ {
{ "", null } { "", null }
}; };
var valueProvider = new DictionaryBasedValueProvider<TestValueBinderMarker>(values); var valueProvider = new DictionaryBasedValueProvider<TestValueBinderMetadata>(values);
// Act // Act
var result = await ModelBindingHelper.TryUpdateModelAsync( var result = await ModelBindingHelper.TryUpdateModelAsync(
@ -105,7 +105,7 @@ namespace Microsoft.AspNet.Mvc.Core.Test
{ "", null }, { "", null },
{ "MyProperty", "MyPropertyValue" } { "MyProperty", "MyPropertyValue" }
}; };
var valueProvider = new DictionaryBasedValueProvider<TestValueBinderMarker>(values); var valueProvider = new DictionaryBasedValueProvider<TestValueBinderMetadata>(values);
// Act // Act
var result = await ModelBindingHelper.TryUpdateModelAsync( var result = await ModelBindingHelper.TryUpdateModelAsync(
@ -137,7 +137,7 @@ namespace Microsoft.AspNet.Mvc.Core.Test
public string MyProperty { get; set; } public string MyProperty { get; set; }
} }
private class TestValueBinderMarker : IValueBinderMarker private class TestValueBinderMetadata : IValueProviderMetadata
{ {
} }
} }

View File

@ -64,7 +64,7 @@ namespace Microsoft.AspNet.Mvc.FunctionalTests
} }
[Fact] [Fact]
public async Task ParametersWithNoMarkersUseTheAvailableValueProviders() public async Task ParametersWithNoValueProviderMetadataUseTheAvailableValueProviders()
{ {
// Arrange // Arrange
var server = TestServer.Create(_services, _app); var server = TestServer.Create(_services, _app);
@ -72,8 +72,8 @@ namespace Microsoft.AspNet.Mvc.FunctionalTests
// Act // Act
var response = await var response = await
client.GetAsync("http://localhost/WithMarker" + client.GetAsync("http://localhost/WithMetadata" +
"/ParametersWithNoMarkersUseTheAvailableValueProviders" + "/ParametersWithNoValueProviderMetadataUseTheAvailableValueProviders" +
"?Name=somename&Age=12"); "?Name=somename&Age=12");
//Assert //Assert
@ -94,7 +94,7 @@ namespace Microsoft.AspNet.Mvc.FunctionalTests
// Act // Act
var response = await var response = await
client.GetAsync("http://localhost/WithoutMarker" + client.GetAsync("http://localhost/WithoutMetadata" +
"/GetPersonParameter" + "/GetPersonParameter" +
"?Name=somename&Age=12"); "?Name=somename&Age=12");

View File

@ -931,7 +931,7 @@ namespace Microsoft.AspNet.Mvc.ModelBinding
modelAccessor: null, modelAccessor: null,
methodInfo: methodInfo, methodInfo: methodInfo,
parameterName: parameterName, parameterName: parameterName,
binderMarker: null); binderMetadata: null);
} }
private class Person private class Person

View File

@ -67,7 +67,7 @@ namespace Microsoft.AspNet.Mvc.ModelBinding
modelAccessor: null, modelAccessor: null,
methodInfo: methodInfo, methodInfo: methodInfo,
parameterName: "param", parameterName: "param",
binderMarker: null); binderMetadata: null);
// Assert // Assert
Assert.Equal(expectedIncludedPropertyNames.ToList(), metadata.IncludedProperties); Assert.Equal(expectedIncludedPropertyNames.ToList(), metadata.IncludedProperties);
@ -86,8 +86,8 @@ namespace Microsoft.AspNet.Mvc.ModelBinding
var metadata = provider.GetMetadataForParameter( var metadata = provider.GetMetadataForParameter(
modelAccessor: null, modelAccessor: null,
methodInfo: methodInfo, methodInfo: methodInfo,
parameterName: "param", parameterName: "param",
binderMarker: null); binderMetadata: null);
// Assert // Assert
Assert.Equal("ParameterPrefix", metadata.ModelName); Assert.Equal("ParameterPrefix", metadata.ModelName);
@ -119,8 +119,8 @@ namespace Microsoft.AspNet.Mvc.ModelBinding
var metadata = provider.GetMetadataForParameter( var metadata = provider.GetMetadataForParameter(
modelAccessor: null, modelAccessor: null,
methodInfo: methodInfo, methodInfo: methodInfo,
parameterName: "param", parameterName: "param",
binderMarker: null); binderMetadata: null);
// Assert // Assert
Assert.Equal("ParameterPrefix", metadata.ModelName); Assert.Equal("ParameterPrefix", metadata.ModelName);

View File

@ -68,11 +68,5 @@ namespace Microsoft.AspNet.Mvc.ModelBinding.Test
return Task.FromResult(result); return Task.FromResult(result);
} }
public bool IsValidFor(Type valueProviderMarkerType)
{
// since this is not aware for any marker type, it should return false.
return false;
}
} }
} }

View File

@ -12,53 +12,53 @@ namespace Microsoft.AspNet.Mvc.ModelBinding.Test
{ {
public class CompositeValueProviderTests public class CompositeValueProviderTests
{ {
public static IEnumerable<object[]> RegisteredAsMarkerClasses public static IEnumerable<object[]> RegisteredAsMetadataClasses
{ {
get get
{ {
yield return new object[] { new TestValueBinderMarker() }; yield return new object[] { new TestValueProviderMetadata() };
yield return new object[] { new DerivedValueBinder() }; yield return new object[] { new DerivedValueBinderMetadata() };
} }
} }
[Theory] [Theory]
[MemberData(nameof(RegisteredAsMarkerClasses))] [MemberData(nameof(RegisteredAsMetadataClasses))]
public void FilterReturnsItself_ForAnyClassRegisteredAsGenericParam(IValueBinderMarker binderMarker) public void FilterReturnsItself_ForAnyClassRegisteredAsGenericParam(IValueProviderMetadata metadata)
{ {
// Arrange // Arrange
var values = new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase); var values = new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase);
var unrelatedMarker = new UnrelatedValueBinderMarker(); var unrelatedMetadata = new UnrelatedValueBinderMetadata();
var valueProvider1 = GetMockValueProvider(binderMarker); var valueProvider1 = GetMockValueProvider(metadata);
var valueProvider2 = GetMockValueProvider(unrelatedMarker); var valueProvider2 = GetMockValueProvider(unrelatedMetadata);
var provider = new CompositeValueProvider(new List<IValueProvider>() { valueProvider1.Object, valueProvider2.Object }); var provider = new CompositeValueProvider(new List<IValueProvider>() { valueProvider1.Object, valueProvider2.Object });
// Act // Act
var result = provider.Filter(binderMarker); var result = provider.Filter(metadata);
// Assert // Assert
var valueProvider = Assert.IsType<CompositeValueProvider>(result); var valueProvider = Assert.IsType<CompositeValueProvider>(result);
var filteredProvider = Assert.Single(valueProvider); var filteredProvider = Assert.Single(valueProvider);
// should not be unrelated marker. // should not be unrelated metadata.
Assert.Same(valueProvider1.Object, filteredProvider); Assert.Same(valueProvider1.Object, filteredProvider);
} }
private Mock<IMarkerAwareValueProvider> GetMockValueProvider(IValueBinderMarker marker) private Mock<IMetadataAwareValueProvider> GetMockValueProvider(IValueProviderMetadata metadata)
{ {
var valueProvider = new Mock<IMarkerAwareValueProvider>(); var valueProvider = new Mock<IMetadataAwareValueProvider>();
valueProvider.Setup(o => o.Filter(marker)) valueProvider.Setup(o => o.Filter(metadata))
.Returns(valueProvider.Object); .Returns(valueProvider.Object);
return valueProvider; return valueProvider;
} }
private class TestValueBinderMarker : IValueBinderMarker private class TestValueProviderMetadata : IValueProviderMetadata
{ {
} }
private class DerivedValueBinder : TestValueBinderMarker private class DerivedValueBinderMetadata : TestValueProviderMetadata
{ {
} }
private class UnrelatedValueBinderMarker : IValueBinderMarker private class UnrelatedValueBinderMetadata : IValueProviderMetadata
{ {
} }
} }

View File

@ -18,7 +18,7 @@ namespace Microsoft.AspNet.Mvc.ModelBinding
{ {
{ "test-key", "value" } { "test-key", "value" }
}; };
var provider = new DictionaryBasedValueProvider<TestValueBinderMarker>(values); var provider = new DictionaryBasedValueProvider<TestValueProviderMetadata>(values);
// Act // Act
var result = await provider.GetValueAsync("not-test-key"); var result = await provider.GetValueAsync("not-test-key");
@ -35,7 +35,7 @@ namespace Microsoft.AspNet.Mvc.ModelBinding
{ {
{ "test-key", "test-value" } { "test-key", "test-value" }
}; };
var provider = new DictionaryBasedValueProvider<TestValueBinderMarker>(values); var provider = new DictionaryBasedValueProvider<TestValueProviderMetadata>(values);
// Act // Act
var result = await provider.GetValueAsync("test-key"); var result = await provider.GetValueAsync("test-key");
@ -52,7 +52,7 @@ namespace Microsoft.AspNet.Mvc.ModelBinding
{ {
{ "test-key", null } { "test-key", null }
}; };
var provider = new DictionaryBasedValueProvider<TestValueBinderMarker>(values); var provider = new DictionaryBasedValueProvider<TestValueProviderMetadata>(values);
// Act // Act
var result = await provider.GetValueAsync("test-key"); var result = await provider.GetValueAsync("test-key");
@ -76,7 +76,7 @@ namespace Microsoft.AspNet.Mvc.ModelBinding
{ "bar.baz", 1 }, { "bar.baz", 1 },
}; };
var valueProvider = new DictionaryBasedValueProvider<TestValueBinderMarker>(values); var valueProvider = new DictionaryBasedValueProvider<TestValueProviderMetadata>(values);
// Act // Act
var result = await valueProvider.ContainsPrefixAsync(prefix); var result = await valueProvider.ContainsPrefixAsync(prefix);
@ -97,7 +97,7 @@ namespace Microsoft.AspNet.Mvc.ModelBinding
{ "bar.baz", 2 }, { "bar.baz", 2 },
}; };
var valueProvider = new DictionaryBasedValueProvider<TestValueBinderMarker>(values); var valueProvider = new DictionaryBasedValueProvider<TestValueProviderMetadata>(values);
// Act // Act
var result = await valueProvider.GetValueAsync(prefix); var result = await valueProvider.GetValueAsync(prefix);
@ -115,7 +115,7 @@ namespace Microsoft.AspNet.Mvc.ModelBinding
{ "bar.baz", 2 }, { "bar.baz", 2 },
}; };
var valueProvider = new DictionaryBasedValueProvider<TestValueBinderMarker>(values); var valueProvider = new DictionaryBasedValueProvider<TestValueProviderMetadata>(values);
// Act // Act
var result = await valueProvider.GetValueAsync("bar"); var result = await valueProvider.GetValueAsync("bar");
@ -132,7 +132,7 @@ namespace Microsoft.AspNet.Mvc.ModelBinding
{ {
{ "test-key", "test-value" } { "test-key", "test-value" }
}; };
var provider = new DictionaryBasedValueProvider<TestValueBinderMarker>(values); var provider = new DictionaryBasedValueProvider<TestValueProviderMetadata>(values);
// Act // Act
var result = await provider.ContainsPrefixAsync("not-test-key"); var result = await provider.ContainsPrefixAsync("not-test-key");
@ -149,7 +149,7 @@ namespace Microsoft.AspNet.Mvc.ModelBinding
{ {
{ "test-key", "test-value" } { "test-key", "test-value" }
}; };
var provider = new DictionaryBasedValueProvider<TestValueBinderMarker>(values); var provider = new DictionaryBasedValueProvider<TestValueProviderMetadata>(values);
// Act // Act
var result = await provider.ContainsPrefixAsync("test-key"); var result = await provider.ContainsPrefixAsync("test-key");
@ -158,36 +158,36 @@ namespace Microsoft.AspNet.Mvc.ModelBinding
Assert.True(result); Assert.True(result);
} }
public static IEnumerable<object[]> RegisteredAsMarkerClasses public static IEnumerable<object[]> RegisteredAsMetadataClasses
{ {
get get
{ {
yield return new object[] { new TestValueBinderMarker() }; yield return new object[] { new TestValueProviderMetadata() };
yield return new object[] { new DerivedValueBinder() }; yield return new object[] { new DerivedValueProviderMetadata() };
} }
} }
[Theory] [Theory]
[MemberData(nameof(RegisteredAsMarkerClasses))] [MemberData(nameof(RegisteredAsMetadataClasses))]
public void FilterReturnsItself_ForAnyClassRegisteredAsGenericParam(IValueBinderMarker binderMarker) public void FilterReturnsItself_ForAnyClassRegisteredAsGenericParam(IValueProviderMetadata metadata)
{ {
// Arrange // Arrange
var values = new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase); var values = new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase);
var provider = new DictionaryBasedValueProvider<TestValueBinderMarker>(values); var provider = new DictionaryBasedValueProvider<TestValueProviderMetadata>(values);
// Act // Act
var result = provider.Filter(binderMarker); var result = provider.Filter(metadata);
// Assert // Assert
Assert.NotNull(result); Assert.NotNull(result);
Assert.IsType<DictionaryBasedValueProvider<TestValueBinderMarker>>(result); Assert.IsType<DictionaryBasedValueProvider<TestValueProviderMetadata>>(result);
} }
private class TestValueBinderMarker : IValueBinderMarker private class TestValueProviderMetadata : IValueProviderMetadata
{ {
} }
private class DerivedValueBinder :TestValueBinderMarker private class DerivedValueProviderMetadata :TestValueProviderMetadata
{ {
} }
} }

View File

@ -42,7 +42,7 @@ namespace Microsoft.AspNet.Mvc.ModelBinding.Test
var result = factory.GetValueProvider(context); var result = factory.GetValueProvider(context);
// Assert // Assert
var valueProvider = Assert.IsType<ReadableStringCollectionValueProvider<IFormDataMarker>>(result); var valueProvider = Assert.IsType<ReadableStringCollectionValueProvider<IFormDataValueProviderMetadata>>(result);
Assert.Equal(CultureInfo.CurrentCulture, valueProvider.Culture); Assert.Equal(CultureInfo.CurrentCulture, valueProvider.Culture);
} }

View File

@ -26,13 +26,15 @@ namespace Microsoft.AspNet.Mvc.ModelBinding.Test
var context = new Mock<HttpContext>(); var context = new Mock<HttpContext>();
context.SetupGet(c => c.Items).Returns(new Dictionary<object, object>()); context.SetupGet(c => c.Items).Returns(new Dictionary<object, object>());
context.SetupGet(c => c.Request).Returns(request.Object); context.SetupGet(c => c.Request).Returns(request.Object);
var factoryContext = new ValueProviderFactoryContext(context.Object, new Dictionary<String, object>(StringComparer.OrdinalIgnoreCase)); var factoryContext = new ValueProviderFactoryContext(
context.Object,
new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase));
// Act // Act
var result = _factory.GetValueProvider(factoryContext); var result = _factory.GetValueProvider(factoryContext);
// Assert // Assert
var valueProvider = Assert.IsType<ReadableStringCollectionValueProvider<IQueryBinderMarker>>(result); var valueProvider = Assert.IsType<ReadableStringCollectionValueProvider<IQueryValueProviderMetadata>>(result);
Assert.Equal(CultureInfo.InvariantCulture, valueProvider.Culture); Assert.Equal(CultureInfo.InvariantCulture, valueProvider.Culture);
} }
#endif #endif

View File

@ -28,7 +28,7 @@ namespace Microsoft.AspNet.Mvc.ModelBinding.Test
{ {
// Arrange // Arrange
var backingStore = new ReadableStringCollection(new Dictionary<string, string[]>()); var backingStore = new ReadableStringCollection(new Dictionary<string, string[]>());
var valueProvider = new ReadableStringCollectionValueProvider<TestValueBinderMarker>(backingStore, null); var valueProvider = new ReadableStringCollectionValueProvider<TestValueProviderMetadata>(backingStore, null);
// Act // Act
var result = await valueProvider.ContainsPrefixAsync(""); var result = await valueProvider.ContainsPrefixAsync("");
@ -41,7 +41,7 @@ namespace Microsoft.AspNet.Mvc.ModelBinding.Test
public async Task ContainsPrefixAsync_WithNonEmptyCollection_ReturnsTrueForEmptyPrefix() public async Task ContainsPrefixAsync_WithNonEmptyCollection_ReturnsTrueForEmptyPrefix()
{ {
// Arrange // Arrange
var valueProvider = new ReadableStringCollectionValueProvider<TestValueBinderMarker>(_backingStore, null); var valueProvider = new ReadableStringCollectionValueProvider<TestValueProviderMetadata>(_backingStore, null);
// Act // Act
var result = await valueProvider.ContainsPrefixAsync(""); var result = await valueProvider.ContainsPrefixAsync("");
@ -54,7 +54,7 @@ namespace Microsoft.AspNet.Mvc.ModelBinding.Test
public async Task ContainsPrefixAsync_WithNonEmptyCollection_ReturnsTrueForKnownPrefixes() public async Task ContainsPrefixAsync_WithNonEmptyCollection_ReturnsTrueForKnownPrefixes()
{ {
// Arrange // Arrange
var valueProvider = new ReadableStringCollectionValueProvider<TestValueBinderMarker>(_backingStore, null); var valueProvider = new ReadableStringCollectionValueProvider<TestValueProviderMetadata>(_backingStore, null);
// Act & Assert // Act & Assert
Assert.True(await valueProvider.ContainsPrefixAsync("foo")); Assert.True(await valueProvider.ContainsPrefixAsync("foo"));
@ -66,7 +66,7 @@ namespace Microsoft.AspNet.Mvc.ModelBinding.Test
public async Task ContainsPrefixAsync_WithNonEmptyCollection_ReturnsFalseForUnknownPrefix() public async Task ContainsPrefixAsync_WithNonEmptyCollection_ReturnsFalseForUnknownPrefix()
{ {
// Arrange // Arrange
var valueProvider = new ReadableStringCollectionValueProvider<TestValueBinderMarker>(_backingStore, null); var valueProvider = new ReadableStringCollectionValueProvider<TestValueProviderMetadata>(_backingStore, null);
// Act // Act
var result = await valueProvider.ContainsPrefixAsync("biff"); var result = await valueProvider.ContainsPrefixAsync("biff");
@ -86,7 +86,7 @@ namespace Microsoft.AspNet.Mvc.ModelBinding.Test
{ "null_value", "null_value" }, { "null_value", "null_value" },
{ "prefix", "prefix" } { "prefix", "prefix" }
}; };
var valueProvider = new ReadableStringCollectionValueProvider<TestValueBinderMarker>(_backingStore, culture: null); var valueProvider = new ReadableStringCollectionValueProvider<TestValueProviderMetadata>(_backingStore, culture: null);
// Act // Act
var result = await valueProvider.GetKeysFromPrefixAsync(""); var result = await valueProvider.GetKeysFromPrefixAsync("");
@ -99,7 +99,7 @@ namespace Microsoft.AspNet.Mvc.ModelBinding.Test
public async Task GetKeysFromPrefixAsync_UnknownPrefix_ReturnsEmptyDictionary() public async Task GetKeysFromPrefixAsync_UnknownPrefix_ReturnsEmptyDictionary()
{ {
// Arrange // Arrange
var valueProvider = new ReadableStringCollectionValueProvider<TestValueBinderMarker>(_backingStore, null); var valueProvider = new ReadableStringCollectionValueProvider<TestValueProviderMetadata>(_backingStore, null);
// Act // Act
var result = await valueProvider.GetKeysFromPrefixAsync("abc"); var result = await valueProvider.GetKeysFromPrefixAsync("abc");
@ -112,7 +112,7 @@ namespace Microsoft.AspNet.Mvc.ModelBinding.Test
public async Task GetKeysFromPrefixAsync_KnownPrefix_ReturnsMatchingItems() public async Task GetKeysFromPrefixAsync_KnownPrefix_ReturnsMatchingItems()
{ {
// Arrange // Arrange
var valueProvider = new ReadableStringCollectionValueProvider<TestValueBinderMarker>(_backingStore, null); var valueProvider = new ReadableStringCollectionValueProvider<TestValueProviderMetadata>(_backingStore, null);
// Act // Act
var result = await valueProvider.GetKeysFromPrefixAsync("bar"); var result = await valueProvider.GetKeysFromPrefixAsync("bar");
@ -128,7 +128,7 @@ namespace Microsoft.AspNet.Mvc.ModelBinding.Test
{ {
// Arrange // Arrange
var culture = new CultureInfo("fr-FR"); var culture = new CultureInfo("fr-FR");
var valueProvider = new ReadableStringCollectionValueProvider<TestValueBinderMarker>(_backingStore, culture); var valueProvider = new ReadableStringCollectionValueProvider<TestValueProviderMetadata>(_backingStore, culture);
// Act // Act
var vpResult = await valueProvider.GetValueAsync("bar.baz"); var vpResult = await valueProvider.GetValueAsync("bar.baz");
@ -145,7 +145,7 @@ namespace Microsoft.AspNet.Mvc.ModelBinding.Test
{ {
// Arrange // Arrange
var culture = new CultureInfo("fr-FR"); var culture = new CultureInfo("fr-FR");
var valueProvider = new ReadableStringCollectionValueProvider<TestValueBinderMarker>(_backingStore, culture); var valueProvider = new ReadableStringCollectionValueProvider<TestValueProviderMetadata>(_backingStore, culture);
// Act // Act
var vpResult = await valueProvider.GetValueAsync("foo"); var vpResult = await valueProvider.GetValueAsync("foo");
@ -188,7 +188,7 @@ namespace Microsoft.AspNet.Mvc.ModelBinding.Test
{ "key", new string[] { null, null, "value" } } { "key", new string[] { null, null, "value" } }
}); });
var culture = new CultureInfo("fr-FR"); var culture = new CultureInfo("fr-FR");
var valueProvider = new ReadableStringCollectionValueProvider<TestValueBinderMarker>(backingStore, culture); var valueProvider = new ReadableStringCollectionValueProvider<TestValueProviderMetadata>(backingStore, culture);
// Act // Act
var vpResult = await valueProvider.GetValueAsync("key"); var vpResult = await valueProvider.GetValueAsync("key");
@ -202,7 +202,7 @@ namespace Microsoft.AspNet.Mvc.ModelBinding.Test
public async Task GetValueAsync_ReturnsNullIfKeyNotFound() public async Task GetValueAsync_ReturnsNullIfKeyNotFound()
{ {
// Arrange // Arrange
var valueProvider = new ReadableStringCollectionValueProvider<TestValueBinderMarker>(_backingStore, null); var valueProvider = new ReadableStringCollectionValueProvider<TestValueProviderMetadata>(_backingStore, null);
// Act // Act
var vpResult = await valueProvider.GetValueAsync("bar"); var vpResult = await valueProvider.GetValueAsync("bar");
@ -211,35 +211,35 @@ namespace Microsoft.AspNet.Mvc.ModelBinding.Test
Assert.Null(vpResult); Assert.Null(vpResult);
} }
public static IEnumerable<object[]> RegisteredAsMarkerClasses public static IEnumerable<object[]> RegisteredAsMetadataClasses
{ {
get get
{ {
yield return new object[] { new TestValueBinderMarker() }; yield return new object[] { new TestValueProviderMetadata() };
yield return new object[] { new DerivedValueBinder() }; yield return new object[] { new DerivedValueProviderMetadata() };
} }
} }
[Theory] [Theory]
[MemberData(nameof(RegisteredAsMarkerClasses))] [MemberData(nameof(RegisteredAsMetadataClasses))]
public void FilterReturnsItself_ForAnyClassRegisteredAsGenericParam(IValueBinderMarker binderMarker) public void FilterReturnsItself_ForAnyClassRegisteredAsGenericParam(IValueProviderMetadata metadata)
{ {
// Arrange // Arrange
var valueProvider = new ReadableStringCollectionValueProvider<TestValueBinderMarker>(_backingStore, null); var valueProvider = new ReadableStringCollectionValueProvider<TestValueProviderMetadata>(_backingStore, null);
// Act // Act
var result = valueProvider.Filter(binderMarker); var result = valueProvider.Filter(metadata);
// Assert // Assert
Assert.NotNull(result); Assert.NotNull(result);
Assert.IsType<ReadableStringCollectionValueProvider<TestValueBinderMarker>>(result); Assert.IsType<ReadableStringCollectionValueProvider<TestValueProviderMetadata>>(result);
} }
private class TestValueBinderMarker : IValueBinderMarker private class TestValueProviderMetadata : IValueProviderMetadata
{ {
} }
private class DerivedValueBinder : TestValueBinderMarker private class DerivedValueProviderMetadata : TestValueProviderMetadata
{ {
} }
} }

View File

@ -275,7 +275,7 @@ namespace System.Web.Http
foreach (var action in actions) foreach (var action in actions)
{ {
var parameter = Assert.Single(action.Parameters); var parameter = Assert.Single(action.Parameters);
Assert.IsType<FromUriAttribute>(parameter.BinderMarker); Assert.IsType<FromUriAttribute>(parameter.BinderMetadata);
} }
} }
@ -302,12 +302,12 @@ namespace System.Web.Http
foreach (var action in actions) foreach (var action in actions)
{ {
var parameter = Assert.Single(action.Parameters); var parameter = Assert.Single(action.Parameters);
Assert.IsType<FromBodyAttribute>(parameter.BinderMarker); Assert.IsType<FromBodyAttribute>(parameter.BinderMetadata);
} }
} }
[Fact] [Fact]
public void GetActions_Parameters_BinderMarker() public void GetActions_Parameters_BinderMetadata()
{ {
// Arrange // Arrange
var provider = CreateProvider(); var provider = CreateProvider();
@ -329,7 +329,7 @@ namespace System.Web.Http
foreach (var action in actions) foreach (var action in actions)
{ {
var parameter = Assert.Single(action.Parameters); var parameter = Assert.Single(action.Parameters);
Assert.IsType<ModelBinderAttribute>(parameter.BinderMarker); Assert.IsType<ModelBinderAttribute>(parameter.BinderMetadata);
} }
} }

View File

@ -4,6 +4,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Web.Http; using System.Web.Http;
using Microsoft.AspNet.Http; using Microsoft.AspNet.Http;
using Microsoft.AspNet.Mvc.ModelBinding;
using Microsoft.AspNet.PipelineCore; using Microsoft.AspNet.PipelineCore;
using Microsoft.AspNet.Routing; using Microsoft.AspNet.Routing;
using Xunit; using Xunit;
@ -21,7 +22,7 @@ namespace Microsoft.AspNet.Mvc.WebApiCompatShim
{ {
new ParameterDescriptor() new ParameterDescriptor()
{ {
BinderMarker = new FromUriAttribute(), BinderMetadata = new FromUriAttribute(),
Name = "id", Name = "id",
ParameterBindingInfo = new ParameterBindingInfo("id", typeof(int)), ParameterBindingInfo = new ParameterBindingInfo("id", typeof(int)),
}, },
@ -51,13 +52,13 @@ namespace Microsoft.AspNet.Mvc.WebApiCompatShim
{ {
new ParameterDescriptor() new ParameterDescriptor()
{ {
BinderMarker = new FromUriAttribute(), BinderMetadata = new FromUriAttribute(),
Name = "id", Name = "id",
ParameterBindingInfo = new ParameterBindingInfo("id", typeof(int)), ParameterBindingInfo = new ParameterBindingInfo("id", typeof(int)),
}, },
new ParameterDescriptor() new ParameterDescriptor()
{ {
BinderMarker = new FromUriAttribute(), BinderMetadata = new FromUriAttribute(),
Name = "quantity", Name = "quantity",
ParameterBindingInfo = new ParameterBindingInfo("quantity", typeof(int)), ParameterBindingInfo = new ParameterBindingInfo("quantity", typeof(int)),
}, },
@ -87,13 +88,13 @@ namespace Microsoft.AspNet.Mvc.WebApiCompatShim
{ {
new ParameterDescriptor() new ParameterDescriptor()
{ {
BinderMarker = new FromUriAttribute(), BinderMetadata = new FromUriAttribute(),
Name = "id", Name = "id",
ParameterBindingInfo = new ParameterBindingInfo("id", typeof(int)), ParameterBindingInfo = new ParameterBindingInfo("id", typeof(int)),
}, },
new ParameterDescriptor() new ParameterDescriptor()
{ {
BinderMarker = new FromUriAttribute(), BinderMetadata = new FromUriAttribute(),
Name = "quantity", Name = "quantity",
ParameterBindingInfo = new ParameterBindingInfo("quantity", typeof(int)), ParameterBindingInfo = new ParameterBindingInfo("quantity", typeof(int)),
}, },
@ -123,13 +124,13 @@ namespace Microsoft.AspNet.Mvc.WebApiCompatShim
{ {
new ParameterDescriptor() new ParameterDescriptor()
{ {
BinderMarker = new FromUriAttribute(), BinderMetadata = new FromUriAttribute(),
Name = "id", Name = "id",
ParameterBindingInfo = new ParameterBindingInfo("id", typeof(int)), ParameterBindingInfo = new ParameterBindingInfo("id", typeof(int)),
}, },
new ParameterDescriptor() new ParameterDescriptor()
{ {
BinderMarker = new FromUriAttribute(), BinderMetadata = new FromUriAttribute(),
Name = "quantity", Name = "quantity",
ParameterBindingInfo = new ParameterBindingInfo("quantity", typeof(int)), ParameterBindingInfo = new ParameterBindingInfo("quantity", typeof(int)),
}, },
@ -159,13 +160,13 @@ namespace Microsoft.AspNet.Mvc.WebApiCompatShim
{ {
new ParameterDescriptor() new ParameterDescriptor()
{ {
BinderMarker = new FromUriAttribute(), BinderMetadata = new FromUriAttribute(),
Name = "id", Name = "id",
ParameterBindingInfo = new ParameterBindingInfo("id", typeof(int)), ParameterBindingInfo = new ParameterBindingInfo("id", typeof(int)),
}, },
new ParameterDescriptor() new ParameterDescriptor()
{ {
BinderMarker = new FromUriAttribute(), BinderMetadata = new FromUriAttribute(),
Name = "quantity", Name = "quantity",
IsOptional = true, IsOptional = true,
ParameterBindingInfo = new ParameterBindingInfo("quantity", typeof(int)), ParameterBindingInfo = new ParameterBindingInfo("quantity", typeof(int)),
@ -196,13 +197,13 @@ namespace Microsoft.AspNet.Mvc.WebApiCompatShim
{ {
new ParameterDescriptor() new ParameterDescriptor()
{ {
BinderMarker = new FromUriAttribute(), BinderMetadata = new FromUriAttribute(),
Name = "id", Name = "id",
ParameterBindingInfo = new ParameterBindingInfo("id", typeof(int)), ParameterBindingInfo = new ParameterBindingInfo("id", typeof(int)),
}, },
new ParameterDescriptor() new ParameterDescriptor()
{ {
BinderMarker = new FromUriAttribute(), BinderMetadata = new FromUriAttribute(),
Name = "quantity", Name = "quantity",
ParameterBindingInfo = new ParameterBindingInfo("quantity", typeof(int)), ParameterBindingInfo = new ParameterBindingInfo("quantity", typeof(int)),
}, },
@ -213,13 +214,13 @@ namespace Microsoft.AspNet.Mvc.WebApiCompatShim
{ {
new ParameterDescriptor() new ParameterDescriptor()
{ {
BinderMarker = new FromUriAttribute(), BinderMetadata = new FromUriAttribute(),
Name = "id", Name = "id",
ParameterBindingInfo = new ParameterBindingInfo("id", typeof(int)), ParameterBindingInfo = new ParameterBindingInfo("id", typeof(int)),
}, },
new ParameterDescriptor() new ParameterDescriptor()
{ {
BinderMarker = new FromUriAttribute(), BinderMetadata = new FromUriAttribute(),
Name = "quantity_ordered", Name = "quantity_ordered",
ParameterBindingInfo = new ParameterBindingInfo("quantity_ordered", typeof(int)), ParameterBindingInfo = new ParameterBindingInfo("quantity_ordered", typeof(int)),
}, },
@ -253,7 +254,7 @@ namespace Microsoft.AspNet.Mvc.WebApiCompatShim
{ {
new ParameterDescriptor() new ParameterDescriptor()
{ {
BinderMarker = new FromUriAttribute(), BinderMetadata = new FromUriAttribute(),
Name = "id", Name = "id",
ParameterBindingInfo = new ParameterBindingInfo("id", typeof(int)), ParameterBindingInfo = new ParameterBindingInfo("id", typeof(int)),
}, },
@ -264,13 +265,13 @@ namespace Microsoft.AspNet.Mvc.WebApiCompatShim
{ {
new ParameterDescriptor() new ParameterDescriptor()
{ {
BinderMarker = new FromUriAttribute(), BinderMetadata = new FromUriAttribute(),
Name = "id", Name = "id",
ParameterBindingInfo = new ParameterBindingInfo("id", typeof(int)), ParameterBindingInfo = new ParameterBindingInfo("id", typeof(int)),
}, },
new ParameterDescriptor() new ParameterDescriptor()
{ {
BinderMarker = new FromUriAttribute(), BinderMetadata = new FromUriAttribute(),
Name = "quantity", Name = "quantity",
ParameterBindingInfo = new ParameterBindingInfo("quantity", typeof(int)), ParameterBindingInfo = new ParameterBindingInfo("quantity", typeof(int)),
}, },
@ -301,13 +302,13 @@ namespace Microsoft.AspNet.Mvc.WebApiCompatShim
{ {
new ParameterDescriptor() new ParameterDescriptor()
{ {
BinderMarker = new FromUriAttribute(), BinderMetadata = new FromUriAttribute(),
Name = "id", Name = "id",
ParameterBindingInfo = new ParameterBindingInfo("id", typeof(int)), ParameterBindingInfo = new ParameterBindingInfo("id", typeof(int)),
}, },
new ParameterDescriptor() new ParameterDescriptor()
{ {
BinderMarker = new FromUriAttribute(), BinderMetadata = new FromUriAttribute(),
Name = "quantity", Name = "quantity",
IsOptional = true, IsOptional = true,
ParameterBindingInfo = new ParameterBindingInfo("quantity", typeof(int)), ParameterBindingInfo = new ParameterBindingInfo("quantity", typeof(int)),
@ -319,13 +320,13 @@ namespace Microsoft.AspNet.Mvc.WebApiCompatShim
{ {
new ParameterDescriptor() new ParameterDescriptor()
{ {
BinderMarker = new FromUriAttribute(), BinderMetadata = new FromUriAttribute(),
Name = "id", Name = "id",
ParameterBindingInfo = new ParameterBindingInfo("id", typeof(int)), ParameterBindingInfo = new ParameterBindingInfo("id", typeof(int)),
}, },
new ParameterDescriptor() new ParameterDescriptor()
{ {
BinderMarker = new FromUriAttribute(), BinderMetadata = new FromUriAttribute(),
Name = "quantity", Name = "quantity",
ParameterBindingInfo = new ParameterBindingInfo("quantity", typeof(int)), ParameterBindingInfo = new ParameterBindingInfo("quantity", typeof(int)),
}, },
@ -356,13 +357,13 @@ namespace Microsoft.AspNet.Mvc.WebApiCompatShim
{ {
new ParameterDescriptor() new ParameterDescriptor()
{ {
BinderMarker = new FromUriAttribute(), BinderMetadata = new FromUriAttribute(),
Name = "id", Name = "id",
ParameterBindingInfo = new ParameterBindingInfo("id", typeof(int)), ParameterBindingInfo = new ParameterBindingInfo("id", typeof(int)),
}, },
new ParameterDescriptor() new ParameterDescriptor()
{ {
BinderMarker = new FromUriAttribute(), BinderMetadata = new FromUriAttribute(),
Name = "quantity", Name = "quantity",
ParameterBindingInfo = new ParameterBindingInfo("quantity", typeof(int)), ParameterBindingInfo = new ParameterBindingInfo("quantity", typeof(int)),
}, },
@ -373,13 +374,13 @@ namespace Microsoft.AspNet.Mvc.WebApiCompatShim
{ {
new ParameterDescriptor() new ParameterDescriptor()
{ {
BinderMarker = new FromUriAttribute(), BinderMetadata = new FromUriAttribute(),
Name = "id", Name = "id",
ParameterBindingInfo = new ParameterBindingInfo("id", typeof(int)), ParameterBindingInfo = new ParameterBindingInfo("id", typeof(int)),
}, },
new ParameterDescriptor() new ParameterDescriptor()
{ {
BinderMarker = new FromUriAttribute(), BinderMetadata = new FromUriAttribute(),
Name = "price", Name = "price",
ParameterBindingInfo = new ParameterBindingInfo("price", typeof(decimal)), ParameterBindingInfo = new ParameterBindingInfo("price", typeof(decimal)),
}, },
@ -413,7 +414,7 @@ namespace Microsoft.AspNet.Mvc.WebApiCompatShim
{ {
new ParameterDescriptor() new ParameterDescriptor()
{ {
BinderMarker = new FromUriAttribute(), BinderMetadata = new FromUriAttribute(),
Name = "id", Name = "id",
ParameterBindingInfo = new ParameterBindingInfo("id", typeof(int)), ParameterBindingInfo = new ParameterBindingInfo("id", typeof(int)),
}, },
@ -424,13 +425,14 @@ namespace Microsoft.AspNet.Mvc.WebApiCompatShim
{ {
new ParameterDescriptor() new ParameterDescriptor()
{ {
BinderMarker = new FromUriAttribute(), BinderMetadata = new FromUriAttribute(),
Name = "id", Name = "id",
ParameterBindingInfo = new ParameterBindingInfo("id", typeof(int)), ParameterBindingInfo = new ParameterBindingInfo("id", typeof(int)),
}, },
new ParameterDescriptor() new ParameterDescriptor()
{ {
BinderMarker = new FromUriAttribute(), BinderMetadata = new FromUriAttribute(),
IsOptional = true,
Name = "quantity", Name = "quantity",
ParameterBindingInfo = new ParameterBindingInfo("quantity", typeof(int)), ParameterBindingInfo = new ParameterBindingInfo("quantity", typeof(int)),
}, },
@ -461,7 +463,7 @@ namespace Microsoft.AspNet.Mvc.WebApiCompatShim
{ {
new ParameterDescriptor() new ParameterDescriptor()
{ {
BinderMarker = new FromUriAttribute(), BinderMetadata = new FromUriAttribute(),
Name = "id", Name = "id",
ParameterBindingInfo = new ParameterBindingInfo("id", typeof(int)), ParameterBindingInfo = new ParameterBindingInfo("id", typeof(int)),
}, },
@ -472,13 +474,13 @@ namespace Microsoft.AspNet.Mvc.WebApiCompatShim
{ {
new ParameterDescriptor() new ParameterDescriptor()
{ {
BinderMarker = new FromUriAttribute(), BinderMetadata = new FromUriAttribute(),
Name = "id", Name = "id",
ParameterBindingInfo = new ParameterBindingInfo("id", typeof(int)), ParameterBindingInfo = new ParameterBindingInfo("id", typeof(int)),
}, },
new ParameterDescriptor() new ParameterDescriptor()
{ {
BinderMarker = new FromBodyAttribute(), BinderMetadata = new FromBodyAttribute(),
Name = "quantity", Name = "quantity",
ParameterBindingInfo = new ParameterBindingInfo("quantity", typeof(int)), ParameterBindingInfo = new ParameterBindingInfo("quantity", typeof(int)),
}, },

View File

@ -0,0 +1,29 @@
// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using Microsoft.AspNet.Mvc;
namespace ModelBindingWebSite.Controllers
{
public class WithMetadataController : Controller
{
public EmployeeWithMetadata BindWithTypeMetadata(EmployeeWithMetadata emp)
{
return emp;
}
public DerivedEmployee TypeMetadataAtDerivedTypeWinsOverTheBaseType(DerivedEmployee emp)
{
return emp;
}
public void ParameterMetadataOverridesTypeMetadata([FromBody] Employee emp)
{
}
public Employee ParametersWithNoValueProviderMetadataUseTheAvailableValueProviders([FromQuery] Employee emp)
{
return emp;
}
}
}

View File

@ -1,31 +0,0 @@
// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using Microsoft.AspNet.Mvc;
using Microsoft.AspNet.Mvc.ModelBinding;
namespace ModelBindingWebSite.Controllers
{
public class WithMarkerController : Controller
{
public EmployeeWithMarker BindWithTypeMarker(EmployeeWithMarker emp)
{
return emp;
}
public DerivedEmployee TypeMarkerAtDerivedTypeWinsOverTheBaseType(DerivedEmployee emp)
{
return emp;
}
public void ParameterMarkerOverridesTypeMarker([FromBody] Employee emp)
{
}
public Employee ParametersWithNoMarkersUseTheAvailableValueProviders([FromQuery] Employee emp)
{
return emp;
}
}
}

View File

@ -6,7 +6,7 @@ using Microsoft.AspNet.Mvc;
namespace ModelBindingWebSite.Controllers namespace ModelBindingWebSite.Controllers
{ {
public class WithoutMarkerController : Controller public class WithoutMetadataController : Controller
{ {
public Person Person { get; set; } public Person Person { get; set; }

View File

@ -5,11 +5,11 @@ using Microsoft.AspNet.Mvc;
namespace ModelBindingWebSite namespace ModelBindingWebSite
{ {
public class EmployeeWithMarker : Employee public class EmployeeWithMetadata : Employee
{ {
} }
public class DerivedEmployee : EmployeeWithMarker public class DerivedEmployee : EmployeeWithMetadata
{ {
} }

View File

@ -34,11 +34,6 @@ namespace ValueProvidersSite
var result = new ValueProviderResult(value, value, CultureInfo.CurrentCulture); var result = new ValueProviderResult(value, value, CultureInfo.CurrentCulture);
return Task.FromResult(result); return Task.FromResult(result);
} }
public bool IsValidFor(Type valueProviderMarkerType)
{
return false;
}
} }
} }
} }