diff --git a/build/dependencies.props b/build/dependencies.props index 8fed603b93..22824154bd 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -48,8 +48,8 @@ 2.2.0-preview3-35252 2.2.0-preview3-35252 2.2.0-preview3-35252 - 2.2.0-preview3-35252 - 2.2.0-preview3-35252 + 2.2.0-a-preview3-outbound-parameter-tranformer-16996 + 2.2.0-a-preview3-outbound-parameter-tranformer-16996 2.2.0-preview3-35252 2.2.0-preview3-35252 2.2.0-preview3-35252 diff --git a/src/Microsoft.AspNetCore.Mvc.Core/ApplicationModels/AttributeRouteModel.cs b/src/Microsoft.AspNetCore.Mvc.Core/ApplicationModels/AttributeRouteModel.cs index 3283a630a0..4623d67090 100644 --- a/src/Microsoft.AspNetCore.Mvc.Core/ApplicationModels/AttributeRouteModel.cs +++ b/src/Microsoft.AspNetCore.Mvc.Core/ApplicationModels/AttributeRouteModel.cs @@ -225,7 +225,7 @@ namespace Microsoft.AspNetCore.Mvc.ApplicationModels return ReplaceTokens(template, values, routeTokenTransformer: null); } - public static string ReplaceTokens(string template, IDictionary values, IParameterTransformer routeTokenTransformer) + public static string ReplaceTokens(string template, IDictionary values, IOutboundParameterTransformer routeTokenTransformer) { var builder = new StringBuilder(); var state = TemplateParserState.Plaintext; @@ -379,7 +379,7 @@ namespace Microsoft.AspNetCore.Mvc.ApplicationModels if (routeTokenTransformer != null) { - value = routeTokenTransformer.Transform(value); + value = routeTokenTransformer.TransformOutbound(value); } builder.Append(value); diff --git a/src/Microsoft.AspNetCore.Mvc.Core/ApplicationModels/RouteTokenTransformerConvention.cs b/src/Microsoft.AspNetCore.Mvc.Core/ApplicationModels/RouteTokenTransformerConvention.cs index d7645077af..c83ba6cc47 100644 --- a/src/Microsoft.AspNetCore.Mvc.Core/ApplicationModels/RouteTokenTransformerConvention.cs +++ b/src/Microsoft.AspNetCore.Mvc.Core/ApplicationModels/RouteTokenTransformerConvention.cs @@ -8,17 +8,17 @@ namespace Microsoft.AspNetCore.Mvc.ApplicationModels { /// /// An that sets attribute routing token replacement - /// to use the specified on selectors. + /// to use the specified on selectors. /// public class RouteTokenTransformerConvention : IActionModelConvention { - private readonly IParameterTransformer _parameterTransformer; + private readonly IOutboundParameterTransformer _parameterTransformer; /// - /// Creates a new instance of with the specified . + /// Creates a new instance of with the specified . /// - /// The to use with attribute routing token replacement. - public RouteTokenTransformerConvention(IParameterTransformer parameterTransformer) + /// The to use with attribute routing token replacement. + public RouteTokenTransformerConvention(IOutboundParameterTransformer parameterTransformer) { if (parameterTransformer == null) { @@ -32,7 +32,7 @@ namespace Microsoft.AspNetCore.Mvc.ApplicationModels { if (ShouldApply(action)) { - action.Properties[typeof(IParameterTransformer)] = _parameterTransformer; + action.Properties[typeof(IOutboundParameterTransformer)] = _parameterTransformer; } } diff --git a/src/Microsoft.AspNetCore.Mvc.Core/Internal/ControllerActionDescriptorBuilder.cs b/src/Microsoft.AspNetCore.Mvc.Core/Internal/ControllerActionDescriptorBuilder.cs index 174457bbcc..21ec3aee6b 100644 --- a/src/Microsoft.AspNetCore.Mvc.Core/Internal/ControllerActionDescriptorBuilder.cs +++ b/src/Microsoft.AspNetCore.Mvc.Core/Internal/ControllerActionDescriptorBuilder.cs @@ -390,8 +390,8 @@ namespace Microsoft.AspNetCore.Mvc.Internal { try { - actionDescriptor.Properties.TryGetValue(typeof(IParameterTransformer), out var transformer); - var routeTokenTransformer = transformer as IParameterTransformer; + actionDescriptor.Properties.TryGetValue(typeof(IOutboundParameterTransformer), out var transformer); + var routeTokenTransformer = transformer as IOutboundParameterTransformer; actionDescriptor.AttributeRouteInfo.Template = AttributeRouteModel.ReplaceTokens( actionDescriptor.AttributeRouteInfo.Template, diff --git a/src/Microsoft.AspNetCore.Mvc.Core/Internal/MvcEndpointDataSource.cs b/src/Microsoft.AspNetCore.Mvc.Core/Internal/MvcEndpointDataSource.cs index 0c7a0f74f0..0a1aa08e24 100644 --- a/src/Microsoft.AspNetCore.Mvc.Core/Internal/MvcEndpointDataSource.cs +++ b/src/Microsoft.AspNetCore.Mvc.Core/Internal/MvcEndpointDataSource.cs @@ -277,9 +277,9 @@ namespace Microsoft.AspNetCore.Mvc.Internal // Use the first transformer policy for (var k = 0; k < parameterPolicies.Count; k++) { - if (parameterPolicies[k] is IParameterTransformer parameterTransformer) + if (parameterPolicies[k] is IOutboundParameterTransformer parameterTransformer) { - parameterRouteValue = parameterTransformer.Transform(parameterRouteValue); + parameterRouteValue = parameterTransformer.TransformOutbound(parameterRouteValue); break; } } diff --git a/test/Microsoft.AspNetCore.Mvc.Core.Test/ApplicationModels/RouteTokenTransformerConventionTest.cs b/test/Microsoft.AspNetCore.Mvc.Core.Test/ApplicationModels/RouteTokenTransformerConventionTest.cs index aabefa456e..807bb4d41a 100644 --- a/test/Microsoft.AspNetCore.Mvc.Core.Test/ApplicationModels/RouteTokenTransformerConventionTest.cs +++ b/test/Microsoft.AspNetCore.Mvc.Core.Test/ApplicationModels/RouteTokenTransformerConventionTest.cs @@ -47,7 +47,7 @@ namespace Microsoft.AspNetCore.Mvc.Test.ApplicationModels convention.Apply(model); // Assert - Assert.True(model.Properties.TryGetValue(typeof(IParameterTransformer), out var routeTokenTransformer)); + Assert.True(model.Properties.TryGetValue(typeof(IOutboundParameterTransformer), out var routeTokenTransformer)); Assert.Equal(transformer, routeTokenTransformer); } @@ -68,7 +68,7 @@ namespace Microsoft.AspNetCore.Mvc.Test.ApplicationModels convention.Apply(model); // Assert - Assert.False(model.Properties.TryGetValue(typeof(IParameterTransformer), out _)); + Assert.False(model.Properties.TryGetValue(typeof(IOutboundParameterTransformer), out _)); } private MethodInfo GetMethodInfo() @@ -76,17 +76,17 @@ namespace Microsoft.AspNetCore.Mvc.Test.ApplicationModels return typeof(RouteTokenTransformerConventionTest).GetMethod(nameof(GetMethodInfo), BindingFlags.NonPublic | BindingFlags.Instance); } - private class TestParameterTransformer : IParameterTransformer + private class TestParameterTransformer : IOutboundParameterTransformer { - public string Transform(string value) + public string TransformOutbound(object value) { - return value; + return value?.ToString(); } } private class CustomRouteTokenTransformerConvention : RouteTokenTransformerConvention { - public CustomRouteTokenTransformerConvention(IParameterTransformer parameterTransformer) : base(parameterTransformer) + public CustomRouteTokenTransformerConvention(IOutboundParameterTransformer parameterTransformer) : base(parameterTransformer) { } diff --git a/test/Microsoft.AspNetCore.Mvc.Core.Test/Internal/MvcEndpointDataSourceTests.cs b/test/Microsoft.AspNetCore.Mvc.Core.Test/Internal/MvcEndpointDataSourceTests.cs index 21fd57a11b..168ae2950f 100644 --- a/test/Microsoft.AspNetCore.Mvc.Core.Test/Internal/MvcEndpointDataSourceTests.cs +++ b/test/Microsoft.AspNetCore.Mvc.Core.Test/Internal/MvcEndpointDataSourceTests.cs @@ -771,11 +771,11 @@ namespace Microsoft.AspNetCore.Mvc.Internal return dataSource; } - private class UpperCaseParameterTransform : IParameterTransformer + private class UpperCaseParameterTransform : IOutboundParameterTransformer { - public string Transform(string value) + public string TransformOutbound(object value) { - return value?.ToUpperInvariant(); + return value?.ToString().ToUpperInvariant(); } } diff --git a/test/WebSites/RoutingWebSite/ControllerRouteTokenTransformerConvention.cs b/test/WebSites/RoutingWebSite/ControllerRouteTokenTransformerConvention.cs index 37dca3f259..d2b179a25b 100644 --- a/test/WebSites/RoutingWebSite/ControllerRouteTokenTransformerConvention.cs +++ b/test/WebSites/RoutingWebSite/ControllerRouteTokenTransformerConvention.cs @@ -11,9 +11,9 @@ namespace RoutingWebSite public class ControllerRouteTokenTransformerConvention : IApplicationModelConvention { private readonly Type _controllerType; - private readonly IParameterTransformer _parameterTransformer; + private readonly IOutboundParameterTransformer _parameterTransformer; - public ControllerRouteTokenTransformerConvention(Type controllerType, IParameterTransformer parameterTransformer) + public ControllerRouteTokenTransformerConvention(Type controllerType, IOutboundParameterTransformer parameterTransformer) { if (parameterTransformer == null) { @@ -30,7 +30,7 @@ namespace RoutingWebSite { foreach (var action in controller.Actions) { - action.Properties[typeof(IParameterTransformer)] = _parameterTransformer; + action.Properties[typeof(IOutboundParameterTransformer)] = _parameterTransformer; } } } diff --git a/test/WebSites/RoutingWebSite/TestParameterTransformer.cs b/test/WebSites/RoutingWebSite/TestParameterTransformer.cs index 779d483ca6..a1aa4088f6 100644 --- a/test/WebSites/RoutingWebSite/TestParameterTransformer.cs +++ b/test/WebSites/RoutingWebSite/TestParameterTransformer.cs @@ -7,12 +7,12 @@ using Microsoft.AspNetCore.Routing; namespace RoutingWebSite { - public class SlugifyParameterTransformer : IParameterTransformer + public class SlugifyParameterTransformer : IOutboundParameterTransformer { - public string Transform(string value) + public string TransformOutbound(object value) { // Slugify value - return Regex.Replace(value, "([a-z])([A-Z])", "$1-$2", RegexOptions.None, TimeSpan.FromMilliseconds(100)).ToLower(); + return value == null ? null : Regex.Replace(value.ToString(), "([a-z])([A-Z])", "$1-$2", RegexOptions.None, TimeSpan.FromMilliseconds(100)).ToLower(); } } } \ No newline at end of file