Enabling basic input formatter selection.
Conflicts: Mvc.sln src/Microsoft.AspNet.Mvc.Core/Formatters/TempInputFormatterProvider.cs src/Microsoft.AspNet.Mvc.Core/Microsoft.AspNet.Mvc.Core.kproj src/Microsoft.AspNet.Mvc.Core/ReflectedActionInvoker.cs src/Microsoft.AspNet.Mvc.Core/ReflectedActionInvokerProvider.cs src/Microsoft.AspNet.Mvc/MvcServices.cs test/Microsoft.AspNet.Mvc.Core.Test/Microsoft.AspNet.Mvc.Core.Test.kproj test/Microsoft.AspNet.Mvc.Core.Test/ReflectedActionInvokerTest.cs Conflicts: src/Microsoft.AspNet.Mvc.Core/Formatters/TempInputFormatterProvider.cs
This commit is contained in:
parent
764b1e64b8
commit
6f0fa67170
|
|
@ -1,6 +1,7 @@
|
||||||
// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
|
// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
|
||||||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using Microsoft.AspNet.Http;
|
using Microsoft.AspNet.Http;
|
||||||
using Microsoft.AspNet.Mvc.ModelBinding;
|
using Microsoft.AspNet.Mvc.ModelBinding;
|
||||||
|
|
@ -39,6 +40,12 @@ namespace Microsoft.AspNet.Mvc
|
||||||
public ModelStateDictionary ModelState { get; private set; }
|
public ModelStateDictionary ModelState { get; private set; }
|
||||||
|
|
||||||
public ActionDescriptor ActionDescriptor { get; private set; }
|
public ActionDescriptor ActionDescriptor { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Input formatters associated with this context.
|
||||||
|
/// The formatters are populated only after IInputFormattersProvider runs.
|
||||||
|
/// </summary>
|
||||||
|
public IList<IInputFormatter> InputFormatters { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The controller is available only after the controller factory runs.
|
/// The controller is available only after the controller factory runs.
|
||||||
|
|
|
||||||
|
|
@ -240,16 +240,10 @@ namespace Microsoft.AspNet.Mvc
|
||||||
var modelMetadata = metadataProvider.GetMetadataForType(
|
var modelMetadata = metadataProvider.GetMetadataForType(
|
||||||
modelAccessor: null,
|
modelAccessor: null,
|
||||||
modelType: parameterType);
|
modelType: parameterType);
|
||||||
var providerContext = new InputFormatterProviderContext(
|
|
||||||
actionBindingContext.ActionContext,
|
|
||||||
modelMetadata,
|
|
||||||
modelState);
|
|
||||||
|
|
||||||
var inputFormatter = actionBindingContext.InputFormatterProvider.GetInputFormatter(
|
|
||||||
providerContext);
|
|
||||||
|
|
||||||
var formatterContext = new InputFormatterContext(actionBindingContext.ActionContext,
|
var formatterContext = new InputFormatterContext(actionBindingContext.ActionContext,
|
||||||
modelMetadata.ModelType);
|
modelMetadata.ModelType);
|
||||||
|
var inputFormatter = actionBindingContext.InputFormatterSelector.SelectFormatter(
|
||||||
|
formatterContext);
|
||||||
parameterValues[parameter.Name] = await inputFormatter.ReadAsync(formatterContext);
|
parameterValues[parameter.Name] = await inputFormatter.ReadAsync(formatterContext);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
|
||||||
|
|
@ -6,32 +6,22 @@ using System.Globalization;
|
||||||
|
|
||||||
namespace Microsoft.AspNet.Mvc
|
namespace Microsoft.AspNet.Mvc
|
||||||
{
|
{
|
||||||
public class TempInputFormatterProvider : IInputFormatterProvider
|
public class DefaultInputFormatterSelector : IInputFormatterSelector
|
||||||
{
|
{
|
||||||
private IInputFormattersProvider _defaultFormattersProvider;
|
public IInputFormatter SelectFormatter(InputFormatterContext context)
|
||||||
|
|
||||||
public TempInputFormatterProvider([NotNull] IInputFormattersProvider formattersProvider)
|
|
||||||
{
|
{
|
||||||
_defaultFormattersProvider = formattersProvider;
|
|
||||||
}
|
|
||||||
|
|
||||||
public IInputFormatter GetInputFormatter(InputFormatterProviderContext context)
|
|
||||||
{
|
|
||||||
var request = context.ActionContext.HttpContext.Request;
|
|
||||||
var formatterContext = new InputFormatterContext(context.ActionContext,
|
|
||||||
context.Metadata.ModelType);
|
|
||||||
|
|
||||||
// TODO: https://github.com/aspnet/Mvc/issues/1014
|
// TODO: https://github.com/aspnet/Mvc/issues/1014
|
||||||
var formatters = _defaultFormattersProvider.InputFormatters;
|
var formatters = context.ActionContext.InputFormatters;
|
||||||
foreach (var formatter in formatters)
|
foreach (var formatter in formatters)
|
||||||
{
|
{
|
||||||
var formatterMatched = formatter.CanRead(formatterContext);
|
if (formatter.CanRead(context))
|
||||||
if (formatterMatched)
|
|
||||||
{
|
{
|
||||||
return formatter;
|
return formatter;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var request = context.ActionContext.HttpContext.Request;
|
||||||
|
|
||||||
// TODO: https://github.com/aspnet/Mvc/issues/458
|
// TODO: https://github.com/aspnet/Mvc/issues/458
|
||||||
throw new InvalidOperationException(string.Format(CultureInfo.CurrentCulture,
|
throw new InvalidOperationException(string.Format(CultureInfo.CurrentCulture,
|
||||||
"415: Unsupported content type {0}",
|
"415: Unsupported content type {0}",
|
||||||
|
|
@ -9,8 +9,8 @@ using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace Microsoft.AspNet.Mvc
|
namespace Microsoft.AspNet.Mvc
|
||||||
{
|
{
|
||||||
public interface IInputFormatterProvider
|
public interface IInputFormatterSelector
|
||||||
{
|
{
|
||||||
IInputFormatter GetInputFormatter(InputFormatterProviderContext context);
|
IInputFormatter SelectFormatter(InputFormatterContext context);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1,26 +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 Microsoft.AspNet.Http;
|
|
||||||
using Microsoft.AspNet.Mvc.ModelBinding;
|
|
||||||
|
|
||||||
namespace Microsoft.AspNet.Mvc
|
|
||||||
{
|
|
||||||
public class InputFormatterProviderContext
|
|
||||||
{
|
|
||||||
public InputFormatterProviderContext([NotNull] ActionContext actionContext,
|
|
||||||
[NotNull] ModelMetadata metadata,
|
|
||||||
[NotNull] ModelStateDictionary modelState)
|
|
||||||
{
|
|
||||||
ActionContext = actionContext;
|
|
||||||
Metadata = metadata;
|
|
||||||
ModelState = modelState;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ActionContext ActionContext { get; private set; }
|
|
||||||
|
|
||||||
public ModelMetadata Metadata { get; private set; }
|
|
||||||
|
|
||||||
public ModelStateDictionary ModelState { get; private set; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -59,7 +59,7 @@ namespace Microsoft.AspNet.Mvc
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Get a list of the <see cref="InputFormatterDescriptor" /> which are used to construct
|
/// Get a list of the <see cref="InputFormatterDescriptor" /> which are used to construct
|
||||||
/// a list of <see cref="IInputFormatter"/> by <see cref="IInputFormatterProvider"/>.
|
/// a list of <see cref="IInputFormatter"/> by <see cref="IInputFormattersProvider"/>.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public List<InputFormatterDescriptor> InputFormatters { get; private set; }
|
public List<InputFormatterDescriptor> InputFormatters { get; private set; }
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -12,14 +12,14 @@ namespace Microsoft.AspNet.Mvc
|
||||||
IModelMetadataProvider metadataProvider,
|
IModelMetadataProvider metadataProvider,
|
||||||
IModelBinder modelBinder,
|
IModelBinder modelBinder,
|
||||||
IValueProvider valueProvider,
|
IValueProvider valueProvider,
|
||||||
IInputFormatterProvider inputFormatterProvider,
|
IInputFormatterSelector inputFormatterSelector,
|
||||||
IEnumerable<IModelValidatorProvider> validatorProviders)
|
IEnumerable<IModelValidatorProvider> validatorProviders)
|
||||||
{
|
{
|
||||||
ActionContext = context;
|
ActionContext = context;
|
||||||
MetadataProvider = metadataProvider;
|
MetadataProvider = metadataProvider;
|
||||||
ModelBinder = modelBinder;
|
ModelBinder = modelBinder;
|
||||||
ValueProvider = valueProvider;
|
ValueProvider = valueProvider;
|
||||||
InputFormatterProvider = inputFormatterProvider;
|
InputFormatterSelector = inputFormatterSelector;
|
||||||
ValidatorProviders = validatorProviders;
|
ValidatorProviders = validatorProviders;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -31,7 +31,7 @@ namespace Microsoft.AspNet.Mvc
|
||||||
|
|
||||||
public IValueProvider ValueProvider { get; private set; }
|
public IValueProvider ValueProvider { get; private set; }
|
||||||
|
|
||||||
public IInputFormatterProvider InputFormatterProvider { get; private set; }
|
public IInputFormatterSelector InputFormatterSelector { get; private set; }
|
||||||
|
|
||||||
public IEnumerable<IModelValidatorProvider> ValidatorProviders { get; private set; }
|
public IEnumerable<IModelValidatorProvider> ValidatorProviders { get; private set; }
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -13,20 +13,20 @@ namespace Microsoft.AspNet.Mvc
|
||||||
private readonly IModelMetadataProvider _modelMetadataProvider;
|
private readonly IModelMetadataProvider _modelMetadataProvider;
|
||||||
private readonly ICompositeModelBinder _compositeModelBinder;
|
private readonly ICompositeModelBinder _compositeModelBinder;
|
||||||
private readonly IValueProviderFactory _compositeValueProviderFactory;
|
private readonly IValueProviderFactory _compositeValueProviderFactory;
|
||||||
private readonly IInputFormatterProvider _inputFormatterProvider;
|
private readonly IInputFormatterSelector _inputFormatterSelector;
|
||||||
private readonly IEnumerable<IModelValidatorProvider> _validatorProviders;
|
private readonly IEnumerable<IModelValidatorProvider> _validatorProviders;
|
||||||
private Tuple<ActionContext, ActionBindingContext> _bindingContext;
|
private Tuple<ActionContext, ActionBindingContext> _bindingContext;
|
||||||
|
|
||||||
public DefaultActionBindingContextProvider(IModelMetadataProvider modelMetadataProvider,
|
public DefaultActionBindingContextProvider(IModelMetadataProvider modelMetadataProvider,
|
||||||
ICompositeModelBinder compositeModelBinder,
|
ICompositeModelBinder compositeModelBinder,
|
||||||
ICompositeValueProviderFactory compositeValueProviderFactory,
|
ICompositeValueProviderFactory compositeValueProviderFactory,
|
||||||
IInputFormatterProvider inputFormatterProvider,
|
IInputFormatterSelector inputFormatterProvider,
|
||||||
IEnumerable<IModelValidatorProvider> validatorProviders)
|
IEnumerable<IModelValidatorProvider> validatorProviders)
|
||||||
{
|
{
|
||||||
_modelMetadataProvider = modelMetadataProvider;
|
_modelMetadataProvider = modelMetadataProvider;
|
||||||
_compositeModelBinder = compositeModelBinder;
|
_compositeModelBinder = compositeModelBinder;
|
||||||
_compositeValueProviderFactory = compositeValueProviderFactory;
|
_compositeValueProviderFactory = compositeValueProviderFactory;
|
||||||
_inputFormatterProvider = inputFormatterProvider;
|
_inputFormatterSelector = inputFormatterProvider;
|
||||||
_validatorProviders = validatorProviders;
|
_validatorProviders = validatorProviders;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -51,7 +51,7 @@ namespace Microsoft.AspNet.Mvc
|
||||||
_modelMetadataProvider,
|
_modelMetadataProvider,
|
||||||
_compositeModelBinder,
|
_compositeModelBinder,
|
||||||
valueProvider,
|
valueProvider,
|
||||||
_inputFormatterProvider,
|
_inputFormatterSelector,
|
||||||
_validatorProviders);
|
_validatorProviders);
|
||||||
|
|
||||||
_bindingContext = new Tuple<ActionContext, ActionBindingContext>(actionContext, context);
|
_bindingContext = new Tuple<ActionContext, ActionBindingContext>(actionContext, context);
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,9 @@
|
||||||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Microsoft.AspNet.Mvc.Core;
|
using Microsoft.AspNet.Mvc.Core;
|
||||||
using Microsoft.Framework.DependencyInjection;
|
using Microsoft.Framework.DependencyInjection;
|
||||||
|
|
@ -12,16 +15,19 @@ namespace Microsoft.AspNet.Mvc
|
||||||
{
|
{
|
||||||
private readonly ReflectedActionDescriptor _descriptor;
|
private readonly ReflectedActionDescriptor _descriptor;
|
||||||
private readonly IControllerFactory _controllerFactory;
|
private readonly IControllerFactory _controllerFactory;
|
||||||
|
private readonly IInputFormattersProvider _inputFormattersProvider;
|
||||||
|
|
||||||
public ReflectedActionInvoker([NotNull] ActionContext actionContext,
|
public ReflectedActionInvoker([NotNull] ActionContext actionContext,
|
||||||
[NotNull] IActionBindingContextProvider bindingContextProvider,
|
[NotNull] IActionBindingContextProvider bindingContextProvider,
|
||||||
[NotNull] INestedProviderManager<FilterProviderContext> filterProvider,
|
[NotNull] INestedProviderManager<FilterProviderContext> filterProvider,
|
||||||
[NotNull] IControllerFactory controllerFactory,
|
[NotNull] IControllerFactory controllerFactory,
|
||||||
[NotNull] ReflectedActionDescriptor descriptor)
|
[NotNull] ReflectedActionDescriptor descriptor,
|
||||||
|
[NotNull] IInputFormattersProvider inputFormattersProvider)
|
||||||
: base(actionContext, bindingContextProvider, filterProvider)
|
: base(actionContext, bindingContextProvider, filterProvider)
|
||||||
{
|
{
|
||||||
_descriptor = descriptor;
|
_descriptor = descriptor;
|
||||||
_controllerFactory = controllerFactory;
|
_controllerFactory = controllerFactory;
|
||||||
|
_inputFormattersProvider = inputFormattersProvider;
|
||||||
if (descriptor.MethodInfo == null)
|
if (descriptor.MethodInfo == null)
|
||||||
{
|
{
|
||||||
throw new ArgumentException(
|
throw new ArgumentException(
|
||||||
|
|
@ -34,9 +40,11 @@ namespace Microsoft.AspNet.Mvc
|
||||||
public override Task InvokeAsync()
|
public override Task InvokeAsync()
|
||||||
{
|
{
|
||||||
ActionContext.Controller = _controllerFactory.CreateController(ActionContext);
|
ActionContext.Controller = _controllerFactory.CreateController(ActionContext);
|
||||||
|
ActionContext.InputFormatters = _inputFormattersProvider.InputFormatters
|
||||||
|
.ToList();
|
||||||
return base.InvokeAsync();
|
return base.InvokeAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override async Task<IActionResult> InvokeActionAsync(ActionExecutingContext actionExecutingContext)
|
protected override async Task<IActionResult> InvokeActionAsync(ActionExecutingContext actionExecutingContext)
|
||||||
{
|
{
|
||||||
var actionMethodInfo = _descriptor.MethodInfo;
|
var actionMethodInfo = _descriptor.MethodInfo;
|
||||||
|
|
@ -81,4 +89,4 @@ namespace Microsoft.AspNet.Mvc
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -10,14 +10,17 @@ namespace Microsoft.AspNet.Mvc
|
||||||
{
|
{
|
||||||
private readonly IControllerFactory _controllerFactory;
|
private readonly IControllerFactory _controllerFactory;
|
||||||
private readonly IActionBindingContextProvider _bindingProvider;
|
private readonly IActionBindingContextProvider _bindingProvider;
|
||||||
|
private readonly IInputFormattersProvider _inputFormattersProvider;
|
||||||
private readonly INestedProviderManager<FilterProviderContext> _filterProvider;
|
private readonly INestedProviderManager<FilterProviderContext> _filterProvider;
|
||||||
|
|
||||||
public ReflectedActionInvokerProvider(IControllerFactory controllerFactory,
|
public ReflectedActionInvokerProvider(IControllerFactory controllerFactory,
|
||||||
IActionBindingContextProvider bindingProvider,
|
IActionBindingContextProvider bindingProvider,
|
||||||
|
IInputFormattersProvider inputFormattersProvider,
|
||||||
INestedProviderManager<FilterProviderContext> filterProvider)
|
INestedProviderManager<FilterProviderContext> filterProvider)
|
||||||
{
|
{
|
||||||
_controllerFactory = controllerFactory;
|
_controllerFactory = controllerFactory;
|
||||||
_bindingProvider = bindingProvider;
|
_bindingProvider = bindingProvider;
|
||||||
|
_inputFormattersProvider = inputFormattersProvider;
|
||||||
_filterProvider = filterProvider;
|
_filterProvider = filterProvider;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -37,7 +40,8 @@ namespace Microsoft.AspNet.Mvc
|
||||||
_bindingProvider,
|
_bindingProvider,
|
||||||
_filterProvider,
|
_filterProvider,
|
||||||
_controllerFactory,
|
_controllerFactory,
|
||||||
actionDescriptor);
|
actionDescriptor,
|
||||||
|
_inputFormattersProvider);
|
||||||
}
|
}
|
||||||
|
|
||||||
callNext();
|
callNext();
|
||||||
|
|
|
||||||
|
|
@ -64,8 +64,8 @@ namespace Microsoft.AspNet.Mvc
|
||||||
yield return describe.Transient<IModelMetadataProvider, DataAnnotationsModelMetadataProvider>();
|
yield return describe.Transient<IModelMetadataProvider, DataAnnotationsModelMetadataProvider>();
|
||||||
yield return describe.Scoped<IActionBindingContextProvider, DefaultActionBindingContextProvider>();
|
yield return describe.Scoped<IActionBindingContextProvider, DefaultActionBindingContextProvider>();
|
||||||
|
|
||||||
yield return describe.Transient<IInputFormatterProvider, TempInputFormatterProvider>();
|
yield return describe.Transient<IInputFormatterSelector, DefaultInputFormatterSelector>();
|
||||||
yield return describe.Transient<IInputFormattersProvider, DefaultInputFormattersProvider>();
|
yield return describe.Scoped<IInputFormattersProvider, DefaultInputFormattersProvider>();
|
||||||
|
|
||||||
yield return describe.Transient<IModelBinderProvider, DefaultModelBindersProvider>();
|
yield return describe.Transient<IModelBinderProvider, DefaultModelBindersProvider>();
|
||||||
yield return describe.Scoped<ICompositeModelBinder, CompositeModelBinder>();
|
yield return describe.Scoped<ICompositeModelBinder, CompositeModelBinder>();
|
||||||
|
|
|
||||||
|
|
@ -577,7 +577,7 @@ namespace Microsoft.AspNet.Mvc.Test
|
||||||
metadataProvider,
|
metadataProvider,
|
||||||
binder.Object,
|
binder.Object,
|
||||||
valueProvider,
|
valueProvider,
|
||||||
Mock.Of<IInputFormatterProvider>(),
|
Mock.Of<IInputFormatterSelector>(),
|
||||||
Enumerable.Empty<IModelValidatorProvider>());
|
Enumerable.Empty<IModelValidatorProvider>());
|
||||||
var bindingContextProvider = new Mock<IActionBindingContextProvider>();
|
var bindingContextProvider = new Mock<IActionBindingContextProvider>();
|
||||||
bindingContextProvider.Setup(b => b.GetActionBindingContextAsync(actionContext))
|
bindingContextProvider.Setup(b => b.GetActionBindingContextAsync(actionContext))
|
||||||
|
|
@ -618,7 +618,7 @@ namespace Microsoft.AspNet.Mvc.Test
|
||||||
metadataProvider,
|
metadataProvider,
|
||||||
binder.Object,
|
binder.Object,
|
||||||
valueProvider,
|
valueProvider,
|
||||||
Mock.Of<IInputFormatterProvider>(),
|
Mock.Of<IInputFormatterSelector>(),
|
||||||
Enumerable.Empty<IModelValidatorProvider>());
|
Enumerable.Empty<IModelValidatorProvider>());
|
||||||
var bindingContextProvider = new Mock<IActionBindingContextProvider>();
|
var bindingContextProvider = new Mock<IActionBindingContextProvider>();
|
||||||
bindingContextProvider.Setup(b => b.GetActionBindingContextAsync(actionContext))
|
bindingContextProvider.Setup(b => b.GetActionBindingContextAsync(actionContext))
|
||||||
|
|
@ -659,7 +659,7 @@ namespace Microsoft.AspNet.Mvc.Test
|
||||||
metadataProvider,
|
metadataProvider,
|
||||||
binder.Object,
|
binder.Object,
|
||||||
Mock.Of<IValueProvider>(),
|
Mock.Of<IValueProvider>(),
|
||||||
Mock.Of<IInputFormatterProvider>(),
|
Mock.Of<IInputFormatterSelector>(),
|
||||||
Enumerable.Empty<IModelValidatorProvider>());
|
Enumerable.Empty<IModelValidatorProvider>());
|
||||||
var bindingContextProvider = new Mock<IActionBindingContextProvider>();
|
var bindingContextProvider = new Mock<IActionBindingContextProvider>();
|
||||||
bindingContextProvider.Setup(b => b.GetActionBindingContextAsync(actionContext))
|
bindingContextProvider.Setup(b => b.GetActionBindingContextAsync(actionContext))
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,70 @@
|
||||||
|
// 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 System.Collections.Generic;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Microsoft.AspNet.Http;
|
||||||
|
using Microsoft.AspNet.Routing;
|
||||||
|
using Microsoft.Framework.DependencyInjection;
|
||||||
|
using Moq;
|
||||||
|
using Xunit;
|
||||||
|
|
||||||
|
namespace Microsoft.AspNet.Mvc.Core.Test
|
||||||
|
{
|
||||||
|
public class DefaultInputFormatterSelectorTests
|
||||||
|
{
|
||||||
|
[Fact]
|
||||||
|
public void DefaultInputFormatterSelectorTests_ReturnsFirstFormatterWhichReturnsTrue()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var actionContext = GetActionContext();
|
||||||
|
var context = new InputFormatterContext(actionContext, typeof(int));
|
||||||
|
actionContext.InputFormatters = new List<IInputFormatter>()
|
||||||
|
{
|
||||||
|
new TestInputFormatter(false, 0),
|
||||||
|
new TestInputFormatter(false, 1),
|
||||||
|
new TestInputFormatter(true, 2),
|
||||||
|
new TestInputFormatter(true, 3)
|
||||||
|
};
|
||||||
|
|
||||||
|
var selector = new DefaultInputFormatterSelector();
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var selectedFormatter = selector.SelectFormatter(context);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
var testFormatter = Assert.IsType<TestInputFormatter>(selectedFormatter);
|
||||||
|
Assert.Equal(2, testFormatter.Index);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static ActionContext GetActionContext()
|
||||||
|
{
|
||||||
|
var httpContext = Mock.Of<HttpContext>();
|
||||||
|
return new ActionContext(httpContext, new RouteData(), new ActionDescriptor());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private class TestInputFormatter : IInputFormatter
|
||||||
|
{
|
||||||
|
private bool _canRead = false;
|
||||||
|
|
||||||
|
public TestInputFormatter(bool canRead, int index)
|
||||||
|
{
|
||||||
|
_canRead = canRead;
|
||||||
|
Index = index;
|
||||||
|
}
|
||||||
|
public int Index { get; set; }
|
||||||
|
|
||||||
|
public bool CanRead(InputFormatterContext context)
|
||||||
|
{
|
||||||
|
return _canRead;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task<object> ReadAsync(InputFormatterContext context)
|
||||||
|
{
|
||||||
|
return Task.FromResult<object>(Index);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1329,13 +1329,16 @@ namespace Microsoft.AspNet.Mvc
|
||||||
.Setup(fp => fp.Invoke(It.IsAny<FilterProviderContext>()))
|
.Setup(fp => fp.Invoke(It.IsAny<FilterProviderContext>()))
|
||||||
.Callback<FilterProviderContext>(
|
.Callback<FilterProviderContext>(
|
||||||
context => context.Results.AddRange(filters.Select(f => new FilterItem(null, f))));
|
context => context.Results.AddRange(filters.Select(f => new FilterItem(null, f))));
|
||||||
|
var inputFormattersProvider = new Mock<IInputFormattersProvider>();
|
||||||
|
inputFormattersProvider.SetupGet(o => o.InputFormatters)
|
||||||
|
.Returns(new List<IInputFormatter>());
|
||||||
var invoker = new ReflectedActionInvoker(
|
var invoker = new ReflectedActionInvoker(
|
||||||
actionContext,
|
actionContext,
|
||||||
actionBindingContextProvider.Object,
|
actionBindingContextProvider.Object,
|
||||||
filterProvider.Object,
|
filterProvider.Object,
|
||||||
controllerFactory.Object,
|
controllerFactory.Object,
|
||||||
actionDescriptor);
|
actionDescriptor,
|
||||||
|
inputFormattersProvider.Object);
|
||||||
|
|
||||||
return invoker;
|
return invoker;
|
||||||
}
|
}
|
||||||
|
|
@ -1366,18 +1369,21 @@ namespace Microsoft.AspNet.Mvc
|
||||||
Mock.Of<IModelMetadataProvider>(),
|
Mock.Of<IModelMetadataProvider>(),
|
||||||
binder.Object,
|
binder.Object,
|
||||||
Mock.Of<IValueProvider>(),
|
Mock.Of<IValueProvider>(),
|
||||||
Mock.Of<IInputFormatterProvider>(),
|
Mock.Of<IInputFormatterSelector>(),
|
||||||
Enumerable.Empty<IModelValidatorProvider>());
|
Enumerable.Empty<IModelValidatorProvider>());
|
||||||
|
|
||||||
var actionBindingContextProvider = new Mock<IActionBindingContextProvider>();
|
var actionBindingContextProvider = new Mock<IActionBindingContextProvider>();
|
||||||
actionBindingContextProvider.Setup(p => p.GetActionBindingContextAsync(It.IsAny<ActionContext>()))
|
actionBindingContextProvider.Setup(p => p.GetActionBindingContextAsync(It.IsAny<ActionContext>()))
|
||||||
.Returns(Task.FromResult(bindingContext));
|
.Returns(Task.FromResult(bindingContext));
|
||||||
|
var inputFormattersProvider = new Mock<IInputFormattersProvider>();
|
||||||
|
inputFormattersProvider.SetupGet(o => o.InputFormatters)
|
||||||
|
.Returns(new List<IInputFormatter>());
|
||||||
var invoker = new ReflectedActionInvoker(actionContext,
|
var invoker = new ReflectedActionInvoker(actionContext,
|
||||||
actionBindingContextProvider.Object,
|
actionBindingContextProvider.Object,
|
||||||
Mock.Of<INestedProviderManager<FilterProviderContext>>(),
|
Mock.Of<INestedProviderManager<FilterProviderContext>>(),
|
||||||
Mock.Of<IControllerFactory>(),
|
Mock.Of<IControllerFactory>(),
|
||||||
actionDescriptor);
|
actionDescriptor,
|
||||||
|
inputFormattersProvider.Object);
|
||||||
|
|
||||||
var modelStateDictionary = new ModelStateDictionary();
|
var modelStateDictionary = new ModelStateDictionary();
|
||||||
|
|
||||||
|
|
@ -1422,18 +1428,21 @@ namespace Microsoft.AspNet.Mvc
|
||||||
Mock.Of<IModelMetadataProvider>(),
|
Mock.Of<IModelMetadataProvider>(),
|
||||||
binder.Object,
|
binder.Object,
|
||||||
Mock.Of<IValueProvider>(),
|
Mock.Of<IValueProvider>(),
|
||||||
Mock.Of<IInputFormatterProvider>(),
|
Mock.Of<IInputFormatterSelector>(),
|
||||||
Enumerable.Empty<IModelValidatorProvider>());
|
Enumerable.Empty<IModelValidatorProvider>());
|
||||||
|
|
||||||
var actionBindingContextProvider = new Mock<IActionBindingContextProvider>();
|
var actionBindingContextProvider = new Mock<IActionBindingContextProvider>();
|
||||||
actionBindingContextProvider.Setup(p => p.GetActionBindingContextAsync(It.IsAny<ActionContext>()))
|
actionBindingContextProvider.Setup(p => p.GetActionBindingContextAsync(It.IsAny<ActionContext>()))
|
||||||
.Returns(Task.FromResult(bindingContext));
|
.Returns(Task.FromResult(bindingContext));
|
||||||
|
var inputFormattersProvider = new Mock<IInputFormattersProvider>();
|
||||||
|
inputFormattersProvider.SetupGet(o => o.InputFormatters)
|
||||||
|
.Returns(new List<IInputFormatter>());
|
||||||
var invoker = new ReflectedActionInvoker(actionContext,
|
var invoker = new ReflectedActionInvoker(actionContext,
|
||||||
actionBindingContextProvider.Object,
|
actionBindingContextProvider.Object,
|
||||||
Mock.Of<INestedProviderManager<FilterProviderContext>>(),
|
Mock.Of<INestedProviderManager<FilterProviderContext>>(),
|
||||||
Mock.Of<IControllerFactory>(),
|
Mock.Of<IControllerFactory>(),
|
||||||
actionDescriptor);
|
actionDescriptor,
|
||||||
|
inputFormattersProvider.Object);
|
||||||
|
|
||||||
var modelStateDictionary = new ModelStateDictionary();
|
var modelStateDictionary = new ModelStateDictionary();
|
||||||
|
|
||||||
|
|
@ -1479,7 +1488,7 @@ namespace Microsoft.AspNet.Mvc
|
||||||
Mock.Of<IModelMetadataProvider>(),
|
Mock.Of<IModelMetadataProvider>(),
|
||||||
binder.Object,
|
binder.Object,
|
||||||
Mock.Of<IValueProvider>(),
|
Mock.Of<IValueProvider>(),
|
||||||
Mock.Of<IInputFormatterProvider>(),
|
Mock.Of<IInputFormatterSelector>(),
|
||||||
Enumerable.Empty<IModelValidatorProvider>());
|
Enumerable.Empty<IModelValidatorProvider>());
|
||||||
|
|
||||||
var actionBindingContextProvider = new Mock<IActionBindingContextProvider>();
|
var actionBindingContextProvider = new Mock<IActionBindingContextProvider>();
|
||||||
|
|
@ -1488,12 +1497,15 @@ namespace Microsoft.AspNet.Mvc
|
||||||
var controllerFactory = new Mock<IControllerFactory>();
|
var controllerFactory = new Mock<IControllerFactory>();
|
||||||
controllerFactory.Setup(c => c.CreateController(It.IsAny<ActionContext>()))
|
controllerFactory.Setup(c => c.CreateController(It.IsAny<ActionContext>()))
|
||||||
.Returns(new TestController());
|
.Returns(new TestController());
|
||||||
|
var inputFormattersProvider = new Mock<IInputFormattersProvider>();
|
||||||
|
inputFormattersProvider.SetupGet(o => o.InputFormatters)
|
||||||
|
.Returns(new List<IInputFormatter>());
|
||||||
var invoker = new ReflectedActionInvoker(actionContext,
|
var invoker = new ReflectedActionInvoker(actionContext,
|
||||||
actionBindingContextProvider.Object,
|
actionBindingContextProvider.Object,
|
||||||
Mock.Of<INestedProviderManager<FilterProviderContext>>(),
|
Mock.Of<INestedProviderManager<FilterProviderContext>>(),
|
||||||
controllerFactory.Object,
|
controllerFactory.Object,
|
||||||
actionDescriptor);
|
actionDescriptor,
|
||||||
|
inputFormattersProvider.Object);
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
await invoker.InvokeAsync();
|
await invoker.InvokeAsync();
|
||||||
|
|
|
||||||
|
|
@ -92,7 +92,7 @@ namespace Microsoft.AspNet.Mvc.Core
|
||||||
provider,
|
provider,
|
||||||
Mock.Of<IModelBinder>(),
|
Mock.Of<IModelBinder>(),
|
||||||
Mock.Of<IValueProvider>(),
|
Mock.Of<IValueProvider>(),
|
||||||
Mock.Of<IInputFormatterProvider>(),
|
Mock.Of<IInputFormatterSelector>(),
|
||||||
Enumerable.Empty<IModelValidatorProvider>());
|
Enumerable.Empty<IModelValidatorProvider>());
|
||||||
var urlHelper = Mock.Of<IUrlHelper>();
|
var urlHelper = Mock.Of<IUrlHelper>();
|
||||||
var actionBindingContextProvider = new Mock<IActionBindingContextProvider>();
|
var actionBindingContextProvider = new Mock<IActionBindingContextProvider>();
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue