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

View File

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

View File

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

View File

@ -13,10 +13,10 @@ using Microsoft.Framework.OptionsModel;
namespace Microsoft.AspNet.Mvc
{
/// <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.
/// </summary>
public class BodyModelBinder : MarkerAwareBinder<IBodyBinderMarker>
public class BodyModelBinder : MetadataAwareBinder<IFormatterBinderMetadata>
{
private readonly ActionContext _actionContext;
private readonly IInputFormatterSelector _formatterSelector;
@ -34,7 +34,9 @@ namespace Microsoft.AspNet.Mvc
_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 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.
using System;
using System.Reflection;
using System.Collections.Generic;
using Microsoft.AspNet.Mvc.ModelBinding;
namespace Microsoft.AspNet.Mvc
@ -17,7 +17,7 @@ namespace Microsoft.AspNet.Mvc
public ParameterBindingInfo ParameterBindingInfo { get; set; }
public IBinderMarker BinderMarker { get; set; }
public IBinderMetadata BinderMetadata { 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.
/// </summary>
[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.
/// </summary>
[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.
/// </summary>
[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.
/// </summary>
[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.
// 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 request body to a model.
/// Interface for metadata related to model binders.
/// </summary>
public interface IBodyBinderMarker : IBinderMarker
public interface IBinderMetadata
{
}
}
}

View File

@ -1,13 +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>
/// 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>
public interface IQueryBinderMarker : IValueBinderMarker
public interface IFormDataValueProviderMetadata : IValueProviderMetadata
{
}
}

View File

@ -1,13 +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>
/// 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>
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.
// 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
{
/// <summary>
/// Represents a marker used to identify a particular binder applies to a model.
/// Interface for metadata related to value providers.
/// </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.
var marker = oldBindingContext.ModelMetadata.Marker as IValueBinderMarker;
if (marker != null)
var metadata = oldBindingContext.ModelMetadata.BinderMetadata as IValueProviderMetadata;
if (metadata != null)
{
var valueProvider = oldBindingContext.ValueProvider as IMarkerAwareValueProvider;
var valueProvider = oldBindingContext.ValueProvider as IMetadataAwareValueProvider;
if (valueProvider != null)
{
newBindingContext.ValueProvider = valueProvider.Filter(marker);
newBindingContext.ValueProvider = valueProvider.Filter(metadata);
}
}

View File

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

View File

@ -6,27 +6,27 @@ using System.Threading.Tasks;
namespace Microsoft.AspNet.Mvc.ModelBinding
{
/// <summary>
/// Represents an <see cref="IMarkerAwareBinder"/> which can select itself based on the
/// <typeparamref name="TBinderMarker"/>.
/// Represents an <see cref="IMetadataAwareBinder"/> which can select itself based on the
/// <typeparamref name="TBinderMetadata"/>.
/// </summary>
/// <typeparam name="TBinderMarker">Represents a type implementing <see cref="IBinderMarker"/></typeparam>
public abstract class MarkerAwareBinder<TBinderMarker> : IMarkerAwareBinder
where TBinderMarker : IBinderMarker
/// <typeparam name="TBinderMetadata">Represents a type implementing <see cref="IBinderMetadata"/></typeparam>
public abstract class MetadataAwareBinder<TBinderMetadata> : IMetadataAwareBinder
where TBinderMetadata : IBinderMetadata
{
/// <summary>
/// Async function which does the actual binding to bind to a particular model.
/// </summary>
/// <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>
protected abstract Task<bool> BindAsync(ModelBindingContext bindingContext, TBinderMarker marker);
protected abstract Task<bool> BindAsync(ModelBindingContext bindingContext, TBinderMetadata metadata);
public Task<bool> BindModelAsync(ModelBindingContext context)
{
if (context.ModelMetadata.Marker is TBinderMarker)
if (context.ModelMetadata.BinderMetadata is TBinderMetadata)
{
var marker = (TBinderMarker)context.ModelMetadata.Marker;
return BindAsync(context, marker);
var metadata = (TBinderMetadata)context.ModelMetadata.BinderMetadata;
return BindAsync(context, metadata);
}
return Task.FromResult(false);

View File

@ -50,7 +50,7 @@ namespace Microsoft.AspNet.Mvc.ModelBinding
Func<object> modelAccessor,
[NotNull] MethodInfo methodInfo,
[NotNull] string parameterName,
IBinderMarker binderMarker)
IBinderMetadata binderMetadata)
{
var parameter = methodInfo.GetParameters().FirstOrDefault(
param => StringComparer.Ordinal.Equals(param.Name, parameterName));
@ -60,7 +60,7 @@ namespace Microsoft.AspNet.Mvc.ModelBinding
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)
@ -75,13 +75,14 @@ namespace Microsoft.AspNet.Mvc.ModelBinding
private ModelMetadata GetMetadataForParameterCore(Func<object> modelAccessor,
string parameterName,
ParameterInfo parameter,
IBinderMarker binderMarker)
IBinderMetadata binderMetadata)
{
var parameterInfo =
CreateParameterInfo(parameter.ParameterType,
parameter.GetCustomAttributes(),
parameterName,
binderMarker);
binderMetadata);
return CreateMetadataFromPrototype(parameterInfo.Prototype, modelAccessor);
}
@ -172,19 +173,19 @@ namespace Microsoft.AspNet.Mvc.ModelBinding
Type parameterType,
IEnumerable<Attribute> attributes,
string parameterName,
IBinderMarker binderMarker)
IBinderMetadata binderMetadata)
{
var metadataProtoType = CreateMetadataPrototype(attributes: attributes,
containerType: null,
modelType: parameterType,
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)
{
metadataProtoType.ModelName = nameProvider.Name;

View File

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

View File

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

View File

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

View File

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

View File

@ -9,7 +9,7 @@ using System.Threading.Tasks;
namespace Microsoft.AspNet.Mvc.ModelBinding
{
public class CompositeValueProvider : Collection<IValueProvider>, IEnumerableValueProvider, IMarkerAwareValueProvider
public class CompositeValueProvider : Collection<IValueProvider>, IEnumerableValueProvider, IMetadataAwareValueProvider
{
public CompositeValueProvider()
: base()
@ -80,12 +80,12 @@ namespace Microsoft.AspNet.Mvc.ModelBinding
base.SetItem(index, item);
}
public IValueProvider Filter(IValueBinderMarker valueBinderMarker)
public IValueProvider Filter(IValueProviderMetadata valueBinderMetadata)
{
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)
{
filteredValueProviders.Add(result);

View File

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

View File

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

View File

@ -4,15 +4,15 @@
namespace Microsoft.AspNet.Mvc.ModelBinding
{
/// <summary>
/// A value provider which is aware of <see cref="IValueBinderMarker"/>.
/// A value provider which is aware of <see cref="IValueProviderMetadata"/>.
/// </summary>
public interface IMarkerAwareValueProvider : IValueProvider
public interface IMetadataAwareValueProvider : IValueProvider
{
/// <summary>
/// Filters the value provider based on <paramref name="valueBinderMarker"/>.
/// Filters the value provider based on <paramref name="metadata"/>.
/// </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>
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
{
/// <summary>
/// A <see cref="IMarkerAwareValueProvider"/> value provider which can filter
/// based on <see cref="IValueBinderMarker"/>.
/// A <see cref="IMetadataAwareValueProvider"/> value provider which can filter
/// based on <see cref="IValueProviderMetadata"/>.
/// </summary>
/// <typeparam name="TBinderMarker">Represents a type implementing <see cref="IValueBinderMarker"/></typeparam>
public abstract class MarkerAwareValueProvider<TBinderMarker> : IMarkerAwareValueProvider
where TBinderMarker : IValueBinderMarker
/// <typeparam name="TBinderMetadata">Represents a type implementing <see cref="IValueProviderMetadata"/></typeparam>
public abstract class MetadataAwareValueProvider<TBinderMetadata> : IMetadataAwareValueProvider
where TBinderMetadata : IValueProviderMetadata
{
public abstract Task<bool> ContainsPrefixAsync(string prefix);
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;
}

View File

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

View File

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

View File

@ -7,7 +7,7 @@ namespace Microsoft.AspNet.Mvc.ModelBinding
{
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)
{
if (parameter.BinderMarker != null)
if (parameter.BinderMetadata is IBinderMetadata)
{
// This has a binding behavior configured, just leave it alone.
}
else if (ValueProviderResult.CanConvertFromString(parameter.ParameterInfo.ParameterType))
{
// Simple types are by-default from the URI.
parameter.BinderMarker = new FromUriAttribute();
parameter.BinderMetadata = new FromUriAttribute();
}
else
{
// 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)
{
// 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 &&
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()
{

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.
/// </summary>
[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; }
}
}

View File

@ -9,7 +9,7 @@ namespace System.Web.Http
/// An attribute that specifies that the value can be bound by a model binder.
/// </summary>
[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.Collections.Generic;
using Microsoft.AspNet.Mvc.ModelBinding;
using Xunit;
namespace Microsoft.AspNet.Mvc.ApplicationModel
@ -17,7 +18,7 @@ namespace Microsoft.AspNet.Mvc.ApplicationModel
parameter.Action = new ActionModel(typeof(TestController).GetMethod("Edit"));
parameter.Attributes.Add(new FromBodyAttribute());
parameter.BinderMarker = new FromBodyAttribute();
parameter.BinderMetadata = (IBinderMetadata)parameter.Attributes[0];
parameter.IsOptional = true;
parameter.ParameterName = "id";

View File

@ -31,7 +31,7 @@ namespace Microsoft.AspNet.Mvc
.Verifiable();
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);
@ -48,7 +48,7 @@ namespace Microsoft.AspNet.Mvc
{
// Arrange
var bindingContext = GetBindingContext(typeof(Person), inputFormatter: null);
bindingContext.ModelMetadata.Marker = Mock.Of<IBodyBinderMarker>();
bindingContext.ModelMetadata.BinderMetadata = Mock.Of<IFormatterBinderMetadata>();
var binder = bindingContext.ModelBinder;
// Act
@ -56,7 +56,7 @@ namespace Microsoft.AspNet.Mvc
// Assert
// Returns true because it understands the marker.
// Returns true because it understands the metadata type.
Assert.True(binderResult);
Assert.Null(bindingContext.Model);
Assert.True(bindingContext.ModelState.ContainsKey("someName"));
@ -65,19 +65,19 @@ namespace Microsoft.AspNet.Mvc
[Theory]
[InlineData(true)]
[InlineData(false)]
public async Task BindModel_IsMarkerAware(bool useBodyMarker)
public async Task BindModel_IsMetadataAware(bool useBody)
{
// Arrange
var bindingContext = GetBindingContext(typeof(Person), inputFormatter: null);
bindingContext.ModelMetadata.Marker = useBodyMarker ? Mock.Of<IBodyBinderMarker>() :
Mock.Of<IBinderMarker>();
bindingContext.ModelMetadata.BinderMetadata = useBody ? Mock.Of<IFormatterBinderMetadata>() :
Mock.Of<IBinderMetadata>();
var binder = bindingContext.ModelBinder;
// Act
var binderResult = await binder.BindModelAsync(bindingContext);
// Assert
Assert.Equal(useBodyMarker, binderResult);
Assert.Equal(useBody, binderResult);
}
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,
methodInfo: methodInfo,
parameterName: "foo",
binderMarker: null);
binderMetadata: null);
var actionBindingContext = new ActionBindingContext(actionContext,
@ -95,7 +95,7 @@ namespace Microsoft.AspNet.Mvc.Core.Test
var modelMetadata = metadataProvider.GetMetadataForParameter(modelAccessor: null,
methodInfo: methodInfo,
parameterName: "foo1",
binderMarker: null);
binderMetadata: null);
var actionBindingContext = new ActionBindingContext(actionContext,
@ -266,10 +266,10 @@ namespace Microsoft.AspNet.Mvc.Core.Test
{
public string UnmarkedProperty { get; set; }
[NonValueBinderMarker]
[NonValueProviderBinderMetadata]
public string NonValueBinderMarkedProperty { get; set; }
[ValueBinderMarker]
[ValueProviderMetadata]
public string ValueBinderMarkedProperty { get; set; }
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 }
};
var valueProvider = new DictionaryBasedValueProvider<TestValueBinderMarker>(values);
var valueProvider = new DictionaryBasedValueProvider<TestValueBinderMetadata>(values);
// Act
var result = await ModelBindingHelper.TryUpdateModelAsync(
@ -105,7 +105,7 @@ namespace Microsoft.AspNet.Mvc.Core.Test
{ "", null },
{ "MyProperty", "MyPropertyValue" }
};
var valueProvider = new DictionaryBasedValueProvider<TestValueBinderMarker>(values);
var valueProvider = new DictionaryBasedValueProvider<TestValueBinderMetadata>(values);
// Act
var result = await ModelBindingHelper.TryUpdateModelAsync(
@ -137,7 +137,7 @@ namespace Microsoft.AspNet.Mvc.Core.Test
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]
public async Task ParametersWithNoMarkersUseTheAvailableValueProviders()
public async Task ParametersWithNoValueProviderMetadataUseTheAvailableValueProviders()
{
// Arrange
var server = TestServer.Create(_services, _app);
@ -72,8 +72,8 @@ namespace Microsoft.AspNet.Mvc.FunctionalTests
// Act
var response = await
client.GetAsync("http://localhost/WithMarker" +
"/ParametersWithNoMarkersUseTheAvailableValueProviders" +
client.GetAsync("http://localhost/WithMetadata" +
"/ParametersWithNoValueProviderMetadataUseTheAvailableValueProviders" +
"?Name=somename&Age=12");
//Assert
@ -94,7 +94,7 @@ namespace Microsoft.AspNet.Mvc.FunctionalTests
// Act
var response = await
client.GetAsync("http://localhost/WithoutMarker" +
client.GetAsync("http://localhost/WithoutMetadata" +
"/GetPersonParameter" +
"?Name=somename&Age=12");

View File

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

View File

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

View File

@ -68,11 +68,5 @@ namespace Microsoft.AspNet.Mvc.ModelBinding.Test
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 static IEnumerable<object[]> RegisteredAsMarkerClasses
public static IEnumerable<object[]> RegisteredAsMetadataClasses
{
get
{
yield return new object[] { new TestValueBinderMarker() };
yield return new object[] { new DerivedValueBinder() };
yield return new object[] { new TestValueProviderMetadata() };
yield return new object[] { new DerivedValueBinderMetadata() };
}
}
[Theory]
[MemberData(nameof(RegisteredAsMarkerClasses))]
public void FilterReturnsItself_ForAnyClassRegisteredAsGenericParam(IValueBinderMarker binderMarker)
[MemberData(nameof(RegisteredAsMetadataClasses))]
public void FilterReturnsItself_ForAnyClassRegisteredAsGenericParam(IValueProviderMetadata metadata)
{
// Arrange
var values = new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase);
var unrelatedMarker = new UnrelatedValueBinderMarker();
var valueProvider1 = GetMockValueProvider(binderMarker);
var valueProvider2 = GetMockValueProvider(unrelatedMarker);
var unrelatedMetadata = new UnrelatedValueBinderMetadata();
var valueProvider1 = GetMockValueProvider(metadata);
var valueProvider2 = GetMockValueProvider(unrelatedMetadata);
var provider = new CompositeValueProvider(new List<IValueProvider>() { valueProvider1.Object, valueProvider2.Object });
// Act
var result = provider.Filter(binderMarker);
var result = provider.Filter(metadata);
// Assert
var valueProvider = Assert.IsType<CompositeValueProvider>(result);
var filteredProvider = Assert.Single(valueProvider);
// should not be unrelated marker.
// should not be unrelated metadata.
Assert.Same(valueProvider1.Object, filteredProvider);
}
private Mock<IMarkerAwareValueProvider> GetMockValueProvider(IValueBinderMarker marker)
private Mock<IMetadataAwareValueProvider> GetMockValueProvider(IValueProviderMetadata metadata)
{
var valueProvider = new Mock<IMarkerAwareValueProvider>();
valueProvider.Setup(o => o.Filter(marker))
var valueProvider = new Mock<IMetadataAwareValueProvider>();
valueProvider.Setup(o => o.Filter(metadata))
.Returns(valueProvider.Object);
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" }
};
var provider = new DictionaryBasedValueProvider<TestValueBinderMarker>(values);
var provider = new DictionaryBasedValueProvider<TestValueProviderMetadata>(values);
// Act
var result = await provider.GetValueAsync("not-test-key");
@ -35,7 +35,7 @@ namespace Microsoft.AspNet.Mvc.ModelBinding
{
{ "test-key", "test-value" }
};
var provider = new DictionaryBasedValueProvider<TestValueBinderMarker>(values);
var provider = new DictionaryBasedValueProvider<TestValueProviderMetadata>(values);
// Act
var result = await provider.GetValueAsync("test-key");
@ -52,7 +52,7 @@ namespace Microsoft.AspNet.Mvc.ModelBinding
{
{ "test-key", null }
};
var provider = new DictionaryBasedValueProvider<TestValueBinderMarker>(values);
var provider = new DictionaryBasedValueProvider<TestValueProviderMetadata>(values);
// Act
var result = await provider.GetValueAsync("test-key");
@ -76,7 +76,7 @@ namespace Microsoft.AspNet.Mvc.ModelBinding
{ "bar.baz", 1 },
};
var valueProvider = new DictionaryBasedValueProvider<TestValueBinderMarker>(values);
var valueProvider = new DictionaryBasedValueProvider<TestValueProviderMetadata>(values);
// Act
var result = await valueProvider.ContainsPrefixAsync(prefix);
@ -97,7 +97,7 @@ namespace Microsoft.AspNet.Mvc.ModelBinding
{ "bar.baz", 2 },
};
var valueProvider = new DictionaryBasedValueProvider<TestValueBinderMarker>(values);
var valueProvider = new DictionaryBasedValueProvider<TestValueProviderMetadata>(values);
// Act
var result = await valueProvider.GetValueAsync(prefix);
@ -115,7 +115,7 @@ namespace Microsoft.AspNet.Mvc.ModelBinding
{ "bar.baz", 2 },
};
var valueProvider = new DictionaryBasedValueProvider<TestValueBinderMarker>(values);
var valueProvider = new DictionaryBasedValueProvider<TestValueProviderMetadata>(values);
// Act
var result = await valueProvider.GetValueAsync("bar");
@ -132,7 +132,7 @@ namespace Microsoft.AspNet.Mvc.ModelBinding
{
{ "test-key", "test-value" }
};
var provider = new DictionaryBasedValueProvider<TestValueBinderMarker>(values);
var provider = new DictionaryBasedValueProvider<TestValueProviderMetadata>(values);
// Act
var result = await provider.ContainsPrefixAsync("not-test-key");
@ -149,7 +149,7 @@ namespace Microsoft.AspNet.Mvc.ModelBinding
{
{ "test-key", "test-value" }
};
var provider = new DictionaryBasedValueProvider<TestValueBinderMarker>(values);
var provider = new DictionaryBasedValueProvider<TestValueProviderMetadata>(values);
// Act
var result = await provider.ContainsPrefixAsync("test-key");
@ -158,36 +158,36 @@ namespace Microsoft.AspNet.Mvc.ModelBinding
Assert.True(result);
}
public static IEnumerable<object[]> RegisteredAsMarkerClasses
public static IEnumerable<object[]> RegisteredAsMetadataClasses
{
get
{
yield return new object[] { new TestValueBinderMarker() };
yield return new object[] { new DerivedValueBinder() };
yield return new object[] { new TestValueProviderMetadata() };
yield return new object[] { new DerivedValueProviderMetadata() };
}
}
[Theory]
[MemberData(nameof(RegisteredAsMarkerClasses))]
public void FilterReturnsItself_ForAnyClassRegisteredAsGenericParam(IValueBinderMarker binderMarker)
[MemberData(nameof(RegisteredAsMetadataClasses))]
public void FilterReturnsItself_ForAnyClassRegisteredAsGenericParam(IValueProviderMetadata metadata)
{
// Arrange
var values = new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase);
var provider = new DictionaryBasedValueProvider<TestValueBinderMarker>(values);
var provider = new DictionaryBasedValueProvider<TestValueProviderMetadata>(values);
// Act
var result = provider.Filter(binderMarker);
var result = provider.Filter(metadata);
// Assert
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);
// Assert
var valueProvider = Assert.IsType<ReadableStringCollectionValueProvider<IFormDataMarker>>(result);
var valueProvider = Assert.IsType<ReadableStringCollectionValueProvider<IFormDataValueProviderMetadata>>(result);
Assert.Equal(CultureInfo.CurrentCulture, valueProvider.Culture);
}

View File

@ -26,13 +26,15 @@ namespace Microsoft.AspNet.Mvc.ModelBinding.Test
var context = new Mock<HttpContext>();
context.SetupGet(c => c.Items).Returns(new Dictionary<object, 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
var result = _factory.GetValueProvider(factoryContext);
// Assert
var valueProvider = Assert.IsType<ReadableStringCollectionValueProvider<IQueryBinderMarker>>(result);
var valueProvider = Assert.IsType<ReadableStringCollectionValueProvider<IQueryValueProviderMetadata>>(result);
Assert.Equal(CultureInfo.InvariantCulture, valueProvider.Culture);
}
#endif

View File

@ -28,7 +28,7 @@ namespace Microsoft.AspNet.Mvc.ModelBinding.Test
{
// Arrange
var backingStore = new ReadableStringCollection(new Dictionary<string, string[]>());
var valueProvider = new ReadableStringCollectionValueProvider<TestValueBinderMarker>(backingStore, null);
var valueProvider = new ReadableStringCollectionValueProvider<TestValueProviderMetadata>(backingStore, null);
// Act
var result = await valueProvider.ContainsPrefixAsync("");
@ -41,7 +41,7 @@ namespace Microsoft.AspNet.Mvc.ModelBinding.Test
public async Task ContainsPrefixAsync_WithNonEmptyCollection_ReturnsTrueForEmptyPrefix()
{
// Arrange
var valueProvider = new ReadableStringCollectionValueProvider<TestValueBinderMarker>(_backingStore, null);
var valueProvider = new ReadableStringCollectionValueProvider<TestValueProviderMetadata>(_backingStore, null);
// Act
var result = await valueProvider.ContainsPrefixAsync("");
@ -54,7 +54,7 @@ namespace Microsoft.AspNet.Mvc.ModelBinding.Test
public async Task ContainsPrefixAsync_WithNonEmptyCollection_ReturnsTrueForKnownPrefixes()
{
// Arrange
var valueProvider = new ReadableStringCollectionValueProvider<TestValueBinderMarker>(_backingStore, null);
var valueProvider = new ReadableStringCollectionValueProvider<TestValueProviderMetadata>(_backingStore, null);
// Act & Assert
Assert.True(await valueProvider.ContainsPrefixAsync("foo"));
@ -66,7 +66,7 @@ namespace Microsoft.AspNet.Mvc.ModelBinding.Test
public async Task ContainsPrefixAsync_WithNonEmptyCollection_ReturnsFalseForUnknownPrefix()
{
// Arrange
var valueProvider = new ReadableStringCollectionValueProvider<TestValueBinderMarker>(_backingStore, null);
var valueProvider = new ReadableStringCollectionValueProvider<TestValueProviderMetadata>(_backingStore, null);
// Act
var result = await valueProvider.ContainsPrefixAsync("biff");
@ -86,7 +86,7 @@ namespace Microsoft.AspNet.Mvc.ModelBinding.Test
{ "null_value", "null_value" },
{ "prefix", "prefix" }
};
var valueProvider = new ReadableStringCollectionValueProvider<TestValueBinderMarker>(_backingStore, culture: null);
var valueProvider = new ReadableStringCollectionValueProvider<TestValueProviderMetadata>(_backingStore, culture: null);
// Act
var result = await valueProvider.GetKeysFromPrefixAsync("");
@ -99,7 +99,7 @@ namespace Microsoft.AspNet.Mvc.ModelBinding.Test
public async Task GetKeysFromPrefixAsync_UnknownPrefix_ReturnsEmptyDictionary()
{
// Arrange
var valueProvider = new ReadableStringCollectionValueProvider<TestValueBinderMarker>(_backingStore, null);
var valueProvider = new ReadableStringCollectionValueProvider<TestValueProviderMetadata>(_backingStore, null);
// Act
var result = await valueProvider.GetKeysFromPrefixAsync("abc");
@ -112,7 +112,7 @@ namespace Microsoft.AspNet.Mvc.ModelBinding.Test
public async Task GetKeysFromPrefixAsync_KnownPrefix_ReturnsMatchingItems()
{
// Arrange
var valueProvider = new ReadableStringCollectionValueProvider<TestValueBinderMarker>(_backingStore, null);
var valueProvider = new ReadableStringCollectionValueProvider<TestValueProviderMetadata>(_backingStore, null);
// Act
var result = await valueProvider.GetKeysFromPrefixAsync("bar");
@ -128,7 +128,7 @@ namespace Microsoft.AspNet.Mvc.ModelBinding.Test
{
// Arrange
var culture = new CultureInfo("fr-FR");
var valueProvider = new ReadableStringCollectionValueProvider<TestValueBinderMarker>(_backingStore, culture);
var valueProvider = new ReadableStringCollectionValueProvider<TestValueProviderMetadata>(_backingStore, culture);
// Act
var vpResult = await valueProvider.GetValueAsync("bar.baz");
@ -145,7 +145,7 @@ namespace Microsoft.AspNet.Mvc.ModelBinding.Test
{
// Arrange
var culture = new CultureInfo("fr-FR");
var valueProvider = new ReadableStringCollectionValueProvider<TestValueBinderMarker>(_backingStore, culture);
var valueProvider = new ReadableStringCollectionValueProvider<TestValueProviderMetadata>(_backingStore, culture);
// Act
var vpResult = await valueProvider.GetValueAsync("foo");
@ -188,7 +188,7 @@ namespace Microsoft.AspNet.Mvc.ModelBinding.Test
{ "key", new string[] { null, null, "value" } }
});
var culture = new CultureInfo("fr-FR");
var valueProvider = new ReadableStringCollectionValueProvider<TestValueBinderMarker>(backingStore, culture);
var valueProvider = new ReadableStringCollectionValueProvider<TestValueProviderMetadata>(backingStore, culture);
// Act
var vpResult = await valueProvider.GetValueAsync("key");
@ -202,7 +202,7 @@ namespace Microsoft.AspNet.Mvc.ModelBinding.Test
public async Task GetValueAsync_ReturnsNullIfKeyNotFound()
{
// Arrange
var valueProvider = new ReadableStringCollectionValueProvider<TestValueBinderMarker>(_backingStore, null);
var valueProvider = new ReadableStringCollectionValueProvider<TestValueProviderMetadata>(_backingStore, null);
// Act
var vpResult = await valueProvider.GetValueAsync("bar");
@ -211,35 +211,35 @@ namespace Microsoft.AspNet.Mvc.ModelBinding.Test
Assert.Null(vpResult);
}
public static IEnumerable<object[]> RegisteredAsMarkerClasses
public static IEnumerable<object[]> RegisteredAsMetadataClasses
{
get
{
yield return new object[] { new TestValueBinderMarker() };
yield return new object[] { new DerivedValueBinder() };
yield return new object[] { new TestValueProviderMetadata() };
yield return new object[] { new DerivedValueProviderMetadata() };
}
}
[Theory]
[MemberData(nameof(RegisteredAsMarkerClasses))]
public void FilterReturnsItself_ForAnyClassRegisteredAsGenericParam(IValueBinderMarker binderMarker)
[MemberData(nameof(RegisteredAsMetadataClasses))]
public void FilterReturnsItself_ForAnyClassRegisteredAsGenericParam(IValueProviderMetadata metadata)
{
// Arrange
var valueProvider = new ReadableStringCollectionValueProvider<TestValueBinderMarker>(_backingStore, null);
var valueProvider = new ReadableStringCollectionValueProvider<TestValueProviderMetadata>(_backingStore, null);
// Act
var result = valueProvider.Filter(binderMarker);
var result = valueProvider.Filter(metadata);
// Assert
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)
{
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)
{
var parameter = Assert.Single(action.Parameters);
Assert.IsType<FromBodyAttribute>(parameter.BinderMarker);
Assert.IsType<FromBodyAttribute>(parameter.BinderMetadata);
}
}
[Fact]
public void GetActions_Parameters_BinderMarker()
public void GetActions_Parameters_BinderMetadata()
{
// Arrange
var provider = CreateProvider();
@ -329,7 +329,7 @@ namespace System.Web.Http
foreach (var action in actions)
{
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.Web.Http;
using Microsoft.AspNet.Http;
using Microsoft.AspNet.Mvc.ModelBinding;
using Microsoft.AspNet.PipelineCore;
using Microsoft.AspNet.Routing;
using Xunit;
@ -21,7 +22,7 @@ namespace Microsoft.AspNet.Mvc.WebApiCompatShim
{
new ParameterDescriptor()
{
BinderMarker = new FromUriAttribute(),
BinderMetadata = new FromUriAttribute(),
Name = "id",
ParameterBindingInfo = new ParameterBindingInfo("id", typeof(int)),
},
@ -51,13 +52,13 @@ namespace Microsoft.AspNet.Mvc.WebApiCompatShim
{
new ParameterDescriptor()
{
BinderMarker = new FromUriAttribute(),
BinderMetadata = new FromUriAttribute(),
Name = "id",
ParameterBindingInfo = new ParameterBindingInfo("id", typeof(int)),
},
new ParameterDescriptor()
{
BinderMarker = new FromUriAttribute(),
BinderMetadata = new FromUriAttribute(),
Name = "quantity",
ParameterBindingInfo = new ParameterBindingInfo("quantity", typeof(int)),
},
@ -87,13 +88,13 @@ namespace Microsoft.AspNet.Mvc.WebApiCompatShim
{
new ParameterDescriptor()
{
BinderMarker = new FromUriAttribute(),
BinderMetadata = new FromUriAttribute(),
Name = "id",
ParameterBindingInfo = new ParameterBindingInfo("id", typeof(int)),
},
new ParameterDescriptor()
{
BinderMarker = new FromUriAttribute(),
BinderMetadata = new FromUriAttribute(),
Name = "quantity",
ParameterBindingInfo = new ParameterBindingInfo("quantity", typeof(int)),
},
@ -123,13 +124,13 @@ namespace Microsoft.AspNet.Mvc.WebApiCompatShim
{
new ParameterDescriptor()
{
BinderMarker = new FromUriAttribute(),
BinderMetadata = new FromUriAttribute(),
Name = "id",
ParameterBindingInfo = new ParameterBindingInfo("id", typeof(int)),
},
new ParameterDescriptor()
{
BinderMarker = new FromUriAttribute(),
BinderMetadata = new FromUriAttribute(),
Name = "quantity",
ParameterBindingInfo = new ParameterBindingInfo("quantity", typeof(int)),
},
@ -159,13 +160,13 @@ namespace Microsoft.AspNet.Mvc.WebApiCompatShim
{
new ParameterDescriptor()
{
BinderMarker = new FromUriAttribute(),
BinderMetadata = new FromUriAttribute(),
Name = "id",
ParameterBindingInfo = new ParameterBindingInfo("id", typeof(int)),
},
new ParameterDescriptor()
{
BinderMarker = new FromUriAttribute(),
BinderMetadata = new FromUriAttribute(),
Name = "quantity",
IsOptional = true,
ParameterBindingInfo = new ParameterBindingInfo("quantity", typeof(int)),
@ -196,13 +197,13 @@ namespace Microsoft.AspNet.Mvc.WebApiCompatShim
{
new ParameterDescriptor()
{
BinderMarker = new FromUriAttribute(),
BinderMetadata = new FromUriAttribute(),
Name = "id",
ParameterBindingInfo = new ParameterBindingInfo("id", typeof(int)),
},
new ParameterDescriptor()
{
BinderMarker = new FromUriAttribute(),
BinderMetadata = new FromUriAttribute(),
Name = "quantity",
ParameterBindingInfo = new ParameterBindingInfo("quantity", typeof(int)),
},
@ -213,13 +214,13 @@ namespace Microsoft.AspNet.Mvc.WebApiCompatShim
{
new ParameterDescriptor()
{
BinderMarker = new FromUriAttribute(),
BinderMetadata = new FromUriAttribute(),
Name = "id",
ParameterBindingInfo = new ParameterBindingInfo("id", typeof(int)),
},
new ParameterDescriptor()
{
BinderMarker = new FromUriAttribute(),
BinderMetadata = new FromUriAttribute(),
Name = "quantity_ordered",
ParameterBindingInfo = new ParameterBindingInfo("quantity_ordered", typeof(int)),
},
@ -253,7 +254,7 @@ namespace Microsoft.AspNet.Mvc.WebApiCompatShim
{
new ParameterDescriptor()
{
BinderMarker = new FromUriAttribute(),
BinderMetadata = new FromUriAttribute(),
Name = "id",
ParameterBindingInfo = new ParameterBindingInfo("id", typeof(int)),
},
@ -264,13 +265,13 @@ namespace Microsoft.AspNet.Mvc.WebApiCompatShim
{
new ParameterDescriptor()
{
BinderMarker = new FromUriAttribute(),
BinderMetadata = new FromUriAttribute(),
Name = "id",
ParameterBindingInfo = new ParameterBindingInfo("id", typeof(int)),
},
new ParameterDescriptor()
{
BinderMarker = new FromUriAttribute(),
BinderMetadata = new FromUriAttribute(),
Name = "quantity",
ParameterBindingInfo = new ParameterBindingInfo("quantity", typeof(int)),
},
@ -301,13 +302,13 @@ namespace Microsoft.AspNet.Mvc.WebApiCompatShim
{
new ParameterDescriptor()
{
BinderMarker = new FromUriAttribute(),
BinderMetadata = new FromUriAttribute(),
Name = "id",
ParameterBindingInfo = new ParameterBindingInfo("id", typeof(int)),
},
new ParameterDescriptor()
{
BinderMarker = new FromUriAttribute(),
BinderMetadata = new FromUriAttribute(),
Name = "quantity",
IsOptional = true,
ParameterBindingInfo = new ParameterBindingInfo("quantity", typeof(int)),
@ -319,13 +320,13 @@ namespace Microsoft.AspNet.Mvc.WebApiCompatShim
{
new ParameterDescriptor()
{
BinderMarker = new FromUriAttribute(),
BinderMetadata = new FromUriAttribute(),
Name = "id",
ParameterBindingInfo = new ParameterBindingInfo("id", typeof(int)),
},
new ParameterDescriptor()
{
BinderMarker = new FromUriAttribute(),
BinderMetadata = new FromUriAttribute(),
Name = "quantity",
ParameterBindingInfo = new ParameterBindingInfo("quantity", typeof(int)),
},
@ -356,13 +357,13 @@ namespace Microsoft.AspNet.Mvc.WebApiCompatShim
{
new ParameterDescriptor()
{
BinderMarker = new FromUriAttribute(),
BinderMetadata = new FromUriAttribute(),
Name = "id",
ParameterBindingInfo = new ParameterBindingInfo("id", typeof(int)),
},
new ParameterDescriptor()
{
BinderMarker = new FromUriAttribute(),
BinderMetadata = new FromUriAttribute(),
Name = "quantity",
ParameterBindingInfo = new ParameterBindingInfo("quantity", typeof(int)),
},
@ -373,13 +374,13 @@ namespace Microsoft.AspNet.Mvc.WebApiCompatShim
{
new ParameterDescriptor()
{
BinderMarker = new FromUriAttribute(),
BinderMetadata = new FromUriAttribute(),
Name = "id",
ParameterBindingInfo = new ParameterBindingInfo("id", typeof(int)),
},
new ParameterDescriptor()
{
BinderMarker = new FromUriAttribute(),
BinderMetadata = new FromUriAttribute(),
Name = "price",
ParameterBindingInfo = new ParameterBindingInfo("price", typeof(decimal)),
},
@ -413,7 +414,7 @@ namespace Microsoft.AspNet.Mvc.WebApiCompatShim
{
new ParameterDescriptor()
{
BinderMarker = new FromUriAttribute(),
BinderMetadata = new FromUriAttribute(),
Name = "id",
ParameterBindingInfo = new ParameterBindingInfo("id", typeof(int)),
},
@ -424,13 +425,14 @@ namespace Microsoft.AspNet.Mvc.WebApiCompatShim
{
new ParameterDescriptor()
{
BinderMarker = new FromUriAttribute(),
BinderMetadata = new FromUriAttribute(),
Name = "id",
ParameterBindingInfo = new ParameterBindingInfo("id", typeof(int)),
},
new ParameterDescriptor()
{
BinderMarker = new FromUriAttribute(),
BinderMetadata = new FromUriAttribute(),
IsOptional = true,
Name = "quantity",
ParameterBindingInfo = new ParameterBindingInfo("quantity", typeof(int)),
},
@ -461,7 +463,7 @@ namespace Microsoft.AspNet.Mvc.WebApiCompatShim
{
new ParameterDescriptor()
{
BinderMarker = new FromUriAttribute(),
BinderMetadata = new FromUriAttribute(),
Name = "id",
ParameterBindingInfo = new ParameterBindingInfo("id", typeof(int)),
},
@ -472,13 +474,13 @@ namespace Microsoft.AspNet.Mvc.WebApiCompatShim
{
new ParameterDescriptor()
{
BinderMarker = new FromUriAttribute(),
BinderMetadata = new FromUriAttribute(),
Name = "id",
ParameterBindingInfo = new ParameterBindingInfo("id", typeof(int)),
},
new ParameterDescriptor()
{
BinderMarker = new FromBodyAttribute(),
BinderMetadata = new FromBodyAttribute(),
Name = "quantity",
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
{
public class WithoutMarkerController : Controller
public class WithoutMetadataController : Controller
{
public Person Person { get; set; }

View File

@ -5,11 +5,11 @@ using Microsoft.AspNet.Mvc;
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);
return Task.FromResult(result);
}
public bool IsValidFor(Type valueProviderMarkerType)
{
return false;
}
}
}
}