From ee5535203ebcc58ca8847d3765632bea4bcdb38e Mon Sep 17 00:00:00 2001 From: avertes Date: Wed, 22 Nov 2017 01:10:18 +0200 Subject: [PATCH] Fixed rfc3339 formats to work with all localizations (#7066) * Amend rfc3339 formats to work with all localizations Changed time separator ":" to "\:" to prevent it from being substituted with a localized separtor. For example in it-IT locale, datetime-local was formatted as 2017-11-19T22.52.29.223 instead of correct format 2017-11-19T22:52:29.223 --- .../InputTagHelper.cs | 6 +++--- .../Internal/DefaultEditorTemplates.cs | 6 +++--- .../InputTagHelperTest.cs | 14 +++++++------- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/Microsoft.AspNetCore.Mvc.TagHelpers/InputTagHelper.cs b/src/Microsoft.AspNetCore.Mvc.TagHelpers/InputTagHelper.cs index 9d0dab5d6c..654d4668c8 100644 --- a/src/Microsoft.AspNetCore.Mvc.TagHelpers/InputTagHelper.cs +++ b/src/Microsoft.AspNetCore.Mvc.TagHelpers/InputTagHelper.cs @@ -60,9 +60,9 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers new Dictionary(StringComparer.Ordinal) { { "date", "{0:yyyy-MM-dd}" }, - { "datetime", "{0:yyyy-MM-ddTHH:mm:ss.fffK}" }, - { "datetime-local", "{0:yyyy-MM-ddTHH:mm:ss.fff}" }, - { "time", "{0:HH:mm:ss.fff}" }, + { "datetime", @"{0:yyyy-MM-ddTHH\:mm\:ss.fffK}" }, + { "datetime-local", @"{0:yyyy-MM-ddTHH\:mm\:ss.fff}" }, + { "time", @"{0:HH\:mm\:ss.fff}" }, }; /// diff --git a/src/Microsoft.AspNetCore.Mvc.ViewFeatures/Internal/DefaultEditorTemplates.cs b/src/Microsoft.AspNetCore.Mvc.ViewFeatures/Internal/DefaultEditorTemplates.cs index 4a1d9204bc..09c2c60e97 100644 --- a/src/Microsoft.AspNetCore.Mvc.ViewFeatures/Internal/DefaultEditorTemplates.cs +++ b/src/Microsoft.AspNetCore.Mvc.ViewFeatures/Internal/DefaultEditorTemplates.cs @@ -348,13 +348,13 @@ namespace Microsoft.AspNetCore.Mvc.ViewFeatures.Internal public static IHtmlContent DateTimeOffsetTemplate(IHtmlHelper htmlHelper) { - ApplyRfc3339DateFormattingIfNeeded(htmlHelper, "{0:yyyy-MM-ddTHH:mm:ss.fffK}"); + ApplyRfc3339DateFormattingIfNeeded(htmlHelper, @"{0:yyyy-MM-ddTHH\:mm\:ss.fffK}"); return GenerateTextBox(htmlHelper, inputType: "text"); } public static IHtmlContent DateTimeLocalInputTemplate(IHtmlHelper htmlHelper) { - ApplyRfc3339DateFormattingIfNeeded(htmlHelper, "{0:yyyy-MM-ddTHH:mm:ss.fff}"); + ApplyRfc3339DateFormattingIfNeeded(htmlHelper, @"{0:yyyy-MM-ddTHH\:mm\:ss.fff}"); return GenerateTextBox(htmlHelper, inputType: "datetime-local"); } @@ -366,7 +366,7 @@ namespace Microsoft.AspNetCore.Mvc.ViewFeatures.Internal public static IHtmlContent TimeInputTemplate(IHtmlHelper htmlHelper) { - ApplyRfc3339DateFormattingIfNeeded(htmlHelper, "{0:HH:mm:ss.fff}"); + ApplyRfc3339DateFormattingIfNeeded(htmlHelper, @"{0:HH\:mm\:ss.fff}"); return GenerateTextBox(htmlHelper, inputType: "time"); } diff --git a/test/Microsoft.AspNetCore.Mvc.TagHelpers.Test/InputTagHelperTest.cs b/test/Microsoft.AspNetCore.Mvc.TagHelpers.Test/InputTagHelperTest.cs index 2e91a89a75..81a7f61264 100644 --- a/test/Microsoft.AspNetCore.Mvc.TagHelpers.Test/InputTagHelperTest.cs +++ b/test/Microsoft.AspNetCore.Mvc.TagHelpers.Test/InputTagHelperTest.cs @@ -1190,7 +1190,7 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers tagHelper.For.ModelExplorer, tagHelper.For.Name, null, // value - "{0:yyyy-MM-ddTHH:mm:ss.fffK}", + @"{0:yyyy-MM-ddTHH\:mm\:ss.fffK}", htmlAttributes)) // htmlAttributes .Returns(tagBuilder) .Verifiable(); @@ -1213,20 +1213,20 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers [InlineData("Date", Html5DateRenderingMode.CurrentCulture, "{0:d}", "date")] // Format from [DataType]. [InlineData("Date", Html5DateRenderingMode.Rfc3339, "{0:yyyy-MM-dd}", "date")] [InlineData("DateTime", Html5DateRenderingMode.CurrentCulture, null, "datetime-local")] - [InlineData("DateTime", Html5DateRenderingMode.Rfc3339, "{0:yyyy-MM-ddTHH:mm:ss.fff}", "datetime-local")] + [InlineData("DateTime", Html5DateRenderingMode.Rfc3339, @"{0:yyyy-MM-ddTHH\:mm\:ss.fff}", "datetime-local")] [InlineData("DateTimeOffset", Html5DateRenderingMode.CurrentCulture, null, "text")] - [InlineData("DateTimeOffset", Html5DateRenderingMode.Rfc3339, "{0:yyyy-MM-ddTHH:mm:ss.fffK}", "text")] + [InlineData("DateTimeOffset", Html5DateRenderingMode.Rfc3339, @"{0:yyyy-MM-ddTHH\:mm\:ss.fffK}", "text")] [InlineData("DateTimeLocal", Html5DateRenderingMode.CurrentCulture, null, "datetime-local")] - [InlineData("DateTimeLocal", Html5DateRenderingMode.Rfc3339, "{0:yyyy-MM-ddTHH:mm:ss.fff}", "datetime-local")] + [InlineData("DateTimeLocal", Html5DateRenderingMode.Rfc3339, @"{0:yyyy-MM-ddTHH\:mm\:ss.fff}", "datetime-local")] [InlineData("Time", Html5DateRenderingMode.CurrentCulture, "{0:t}", "time")] // Format from [DataType]. - [InlineData("Time", Html5DateRenderingMode.Rfc3339, "{0:HH:mm:ss.fff}", "time")] + [InlineData("Time", Html5DateRenderingMode.Rfc3339, @"{0:HH\:mm\:ss.fff}", "time")] [InlineData("Month", Html5DateRenderingMode.CurrentCulture, "{0:yyyy-MM}", "month")] [InlineData("Month", Html5DateRenderingMode.Rfc3339, "{0:yyyy-MM}", "month")] [InlineData("Week", Html5DateRenderingMode.CurrentCulture, null, "week")] [InlineData("Week", Html5DateRenderingMode.Rfc3339, null, "week")] [InlineData("NullableDate", Html5DateRenderingMode.Rfc3339, "{0:yyyy-MM-dd}", "date")] - [InlineData("NullableDateTime", Html5DateRenderingMode.Rfc3339, "{0:yyyy-MM-ddTHH:mm:ss.fff}", "datetime-local")] - [InlineData("NullableDateTimeOffset", Html5DateRenderingMode.Rfc3339, "{0:yyyy-MM-ddTHH:mm:ss.fffK}", "text")] + [InlineData("NullableDateTime", Html5DateRenderingMode.Rfc3339, @"{0:yyyy-MM-ddTHH\:mm\:ss.fff}", "datetime-local")] + [InlineData("NullableDateTimeOffset", Html5DateRenderingMode.Rfc3339, @"{0:yyyy-MM-ddTHH\:mm\:ss.fffK}", "text")] public async Task ProcessAsync_CallsGenerateTextBox_AddsExpectedAttributesForRfc3339( string propertyName, Html5DateRenderingMode dateRenderingMode,