From 366dbde378259444485178a23e59708f62479fd5 Mon Sep 17 00:00:00 2001 From: Ryan Brandenburg Date: Wed, 15 Feb 2017 16:59:34 -0800 Subject: [PATCH] Add culture constructor to RouteValueProvider --- .../ModelBinding/RouteValueProvider.cs | 22 +++++++++++- .../ModelBinding/RouteValueProviderTests.cs | 36 +++++++++++++++++++ 2 files changed, 57 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.AspNetCore.Mvc.Core/ModelBinding/RouteValueProvider.cs b/src/Microsoft.AspNetCore.Mvc.Core/ModelBinding/RouteValueProvider.cs index eeb229e9fd..72f556c1c0 100644 --- a/src/Microsoft.AspNetCore.Mvc.Core/ModelBinding/RouteValueProvider.cs +++ b/src/Microsoft.AspNetCore.Mvc.Core/ModelBinding/RouteValueProvider.cs @@ -21,9 +21,21 @@ namespace Microsoft.AspNetCore.Mvc.ModelBinding /// /// The of the data. /// The values. + /// Sets to . public RouteValueProvider( BindingSource bindingSource, RouteValueDictionary values) + : this(bindingSource, values, CultureInfo.InvariantCulture) + { + } + + /// + /// Creates a new . + /// + /// The of the data. + /// The values. + /// The culture for route value. + public RouteValueProvider(BindingSource bindingSource, RouteValueDictionary values, CultureInfo culture) : base(bindingSource) { if (bindingSource == null) @@ -36,7 +48,13 @@ namespace Microsoft.AspNetCore.Mvc.ModelBinding throw new ArgumentNullException(nameof(values)); } + if (culture == null) + { + throw new ArgumentNullException(nameof(culture)); + } + _values = values; + Culture = culture; } protected PrefixContainer PrefixContainer @@ -52,6 +70,8 @@ namespace Microsoft.AspNetCore.Mvc.ModelBinding } } + protected CultureInfo Culture { get; } + /// public override bool ContainsPrefix(string key) { @@ -70,7 +90,7 @@ namespace Microsoft.AspNetCore.Mvc.ModelBinding if (_values.TryGetValue(key, out value)) { var stringValue = value as string ?? value?.ToString() ?? string.Empty; - return new ValueProviderResult(stringValue, CultureInfo.InvariantCulture); + return new ValueProviderResult(stringValue, Culture); } else { diff --git a/test/Microsoft.AspNetCore.Mvc.Core.Test/ModelBinding/RouteValueProviderTests.cs b/test/Microsoft.AspNetCore.Mvc.Core.Test/ModelBinding/RouteValueProviderTests.cs index 8b061a8879..8c8c050ae2 100644 --- a/test/Microsoft.AspNetCore.Mvc.Core.Test/ModelBinding/RouteValueProviderTests.cs +++ b/test/Microsoft.AspNetCore.Mvc.Core.Test/ModelBinding/RouteValueProviderTests.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using System.Globalization; using Microsoft.AspNetCore.Routing; using Xunit; @@ -61,6 +62,41 @@ namespace Microsoft.AspNetCore.Mvc.ModelBinding Assert.Equal(string.Empty, (string)result); } + [Fact] + public void GetValue_ReturnsValue_WithDefaultCulture() + { + // Arrange + var values = new RouteValueDictionary(new Dictionary + { + { "test-key", "test-value"} + }); + var provider = new RouteValueProvider(BindingSource.Query, values); + + // Act + var result = provider.GetValue("test-key"); + + // Assert + Assert.Equal(CultureInfo.InvariantCulture, result.Culture); + } + + [Fact] + public void GetValue_ReturnsValue_WithCulture() + { + // Arrange + var values = new RouteValueDictionary(new Dictionary + { + { "test-key", "test-value"} + }); + var culture = new CultureInfo("fr-FR"); + var provider = new RouteValueProvider(BindingSource.Query, values, culture); + + // Act + var result = provider.GetValue("test-key"); + + // Assert + Assert.Equal(new CultureInfo("fr-FR"), result.Culture); + } + [Theory] [InlineData("foo")] [InlineData("bar")]