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