Renaming IBinderMarker and friends to some more descriptive names.
This commit is contained in:
parent
d1c0213a10
commit
61f218c8e4
|
|
@ -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; }
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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; }
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
{
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
{
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
{
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
{
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
{
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
{
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
{
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
{
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
{
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
{
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
{
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
{
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -19,6 +19,6 @@ namespace Microsoft.AspNet.Mvc.ModelBinding
|
|||
Func<object> modelAccessor,
|
||||
[NotNull] MethodInfo methodInfo,
|
||||
[NotNull] string parameterName,
|
||||
IBinderMarker binderMarker);
|
||||
IBinderMetadata binderMetadata);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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; }
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
{
|
||||
}
|
||||
}
|
||||
|
|
@ -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";
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
{
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
{
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
|
||||
|
|
|
|||
|
|
@ -931,7 +931,7 @@ namespace Microsoft.AspNet.Mvc.ModelBinding
|
|||
modelAccessor: null,
|
||||
methodInfo: methodInfo,
|
||||
parameterName: parameterName,
|
||||
binderMarker: null);
|
||||
binderMetadata: null);
|
||||
}
|
||||
|
||||
private class Person
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
{
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
{
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
{
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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)),
|
||||
},
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -6,7 +6,7 @@ using Microsoft.AspNet.Mvc;
|
|||
|
||||
namespace ModelBindingWebSite.Controllers
|
||||
{
|
||||
public class WithoutMarkerController : Controller
|
||||
public class WithoutMetadataController : Controller
|
||||
{
|
||||
public Person Person { get; set; }
|
||||
|
||||
|
|
@ -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
|
||||
{
|
||||
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue