From eb70b1c28c712e27b6a977649adf9f78e95fd8bc Mon Sep 17 00:00:00 2001 From: Doug Bunting Date: Sun, 22 Nov 2015 17:05:01 -0800 Subject: [PATCH] Remove `WebUtility` use and handle `IHtmlContent` return values from view components - #3571 and part of #3123 - split `ContentViewComponentResult` in two - add `HtmlEncoder` to `ViewComponentContext` - remove use of `WebUtility.HtmlEncode()` and `HtmlDecode()` nits: remove unused `using`s in files I had open --- src/Microsoft.AspNet.Mvc.Razor/RazorPage.cs | 3 +- .../ContentViewComponentResult.cs | 51 +++---------- .../DefaultViewComponentHelper.cs | 13 +++- .../DefaultViewComponentInvoker.cs | 14 ++-- .../HtmlContentViewComponentResult.cs | 72 +++++++++++++++++++ .../ViewComponents/ViewComponentContext.cs | 18 ++++- .../ViewFeatures/DefaultEditorTemplates.cs | 1 - .../ViewFeatures/DefaultHtmlGenerator.cs | 1 - .../ViewComponentResultTest.cs | 3 + .../ViewComponentTests.cs | 1 - .../ContentViewComponentResultTest.cs | 32 +++------ .../HtmlContentViewComponentResultTest.cs | 69 ++++++++++++++++++ .../JsonViewComponentResultTest.cs | 9 ++- .../ViewViewComponentResultTest.cs | 2 + .../TagCloudViewComponentTagHelper.cs | 8 +++ 15 files changed, 216 insertions(+), 81 deletions(-) create mode 100644 src/Microsoft.AspNet.Mvc.ViewFeatures/ViewComponents/HtmlContentViewComponentResult.cs create mode 100644 test/Microsoft.AspNet.Mvc.ViewFeatures.Test/ViewComponents/HtmlContentViewComponentResultTest.cs diff --git a/src/Microsoft.AspNet.Mvc.Razor/RazorPage.cs b/src/Microsoft.AspNet.Mvc.Razor/RazorPage.cs index af6f9c3677..c745b36943 100644 --- a/src/Microsoft.AspNet.Mvc.Razor/RazorPage.cs +++ b/src/Microsoft.AspNet.Mvc.Razor/RazorPage.cs @@ -4,7 +4,6 @@ using System; using System.Collections.Generic; using System.Diagnostics; -using System.Globalization; using System.IO; using System.Linq; using System.Security.Claims; @@ -379,7 +378,7 @@ namespace Microsoft.AspNet.Mvc.Razor } else { - // This special case alows us to keep buffering as IHtmlContent until we get to the 'final' + // This special case allows us to keep buffering as IHtmlContent until we get to the 'final' // TextWriter. htmlTextWriter.Write(htmlContent); } diff --git a/src/Microsoft.AspNet.Mvc.ViewFeatures/ViewComponents/ContentViewComponentResult.cs b/src/Microsoft.AspNet.Mvc.ViewFeatures/ViewComponents/ContentViewComponentResult.cs index f2880a5111..2d7dca989e 100644 --- a/src/Microsoft.AspNet.Mvc.ViewFeatures/ViewComponents/ContentViewComponentResult.cs +++ b/src/Microsoft.AspNet.Mvc.ViewFeatures/ViewComponents/ContentViewComponentResult.cs @@ -2,9 +2,8 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Net; using System.Threading.Tasks; -using Microsoft.AspNet.Mvc.Rendering; +using Microsoft.AspNet.Mvc.Internal; namespace Microsoft.AspNet.Mvc.ViewComponents { @@ -12,20 +11,15 @@ namespace Microsoft.AspNet.Mvc.ViewComponents /// An which writes text when executed. /// /// - /// always writes HTML encoded text from the - /// property. - /// - /// When using , the provided content will be HTML - /// encoded and stored in . - /// - /// To write pre-encoded conent, use . + /// The provided content will be HTML-encoded when written. To write pre-encoded content, use an + /// . /// public class ContentViewComponentResult : IViewComponentResult { /// /// Initializes a new . /// - /// Content to write. The content be HTML encoded when output. + /// Content to write. The content will be HTML encoded when written. public ContentViewComponentResult(string content) { if (content == null) @@ -34,25 +28,6 @@ namespace Microsoft.AspNet.Mvc.ViewComponents } Content = content; - EncodedContent = new HtmlString(WebUtility.HtmlEncode(content)); - } - - /// - /// Initializes a new . - /// - /// - /// Content to write. The content is treated as already HTML encoded, and no further encoding - /// will be performed. - /// - public ContentViewComponentResult(HtmlString encodedContent) - { - if (encodedContent == null) - { - throw new ArgumentNullException(nameof(encodedContent)); - } - - EncodedContent = encodedContent; - Content = WebUtility.HtmlDecode(encodedContent.ToString()); } /// @@ -61,12 +36,7 @@ namespace Microsoft.AspNet.Mvc.ViewComponents public string Content { get; } /// - /// Gets the encoded content. - /// - public HtmlString EncodedContent { get; } - - /// - /// Writes the . + /// Encodes and writes the . /// /// The . public void Execute(ViewComponentContext context) @@ -76,22 +46,19 @@ namespace Microsoft.AspNet.Mvc.ViewComponents throw new ArgumentNullException(nameof(context)); } - context.Writer.Write(EncodedContent.ToString()); + context.HtmlEncoder.Encode(context.Writer, Content); } /// - /// Writes the . + /// Encodes and writes the . /// /// The . /// A completed . public Task ExecuteAsync(ViewComponentContext context) { - if (context == null) - { - throw new ArgumentNullException(nameof(context)); - } + Execute(context); - return context.Writer.WriteAsync(EncodedContent.ToString()); + return TaskCache.CompletedTask; } } } diff --git a/src/Microsoft.AspNet.Mvc.ViewFeatures/ViewComponents/DefaultViewComponentHelper.cs b/src/Microsoft.AspNet.Mvc.ViewFeatures/ViewComponents/DefaultViewComponentHelper.cs index a17439ab04..d367bb4e0f 100644 --- a/src/Microsoft.AspNet.Mvc.ViewFeatures/ViewComponents/DefaultViewComponentHelper.cs +++ b/src/Microsoft.AspNet.Mvc.ViewFeatures/ViewComponents/DefaultViewComponentHelper.cs @@ -3,6 +3,7 @@ using System; using System.IO; +using System.Text.Encodings.Web; using System.Threading.Tasks; using Microsoft.AspNet.Html.Abstractions; using Microsoft.AspNet.Mvc.Rendering; @@ -14,12 +15,14 @@ namespace Microsoft.AspNet.Mvc.ViewComponents public class DefaultViewComponentHelper : IViewComponentHelper, ICanHasViewContext { private readonly IViewComponentDescriptorCollectionProvider _descriptorProvider; + private readonly HtmlEncoder _htmlEncoder; private readonly IViewComponentInvokerFactory _invokerFactory; private readonly IViewComponentSelector _selector; private ViewContext _viewContext; public DefaultViewComponentHelper( IViewComponentDescriptorCollectionProvider descriptorProvider, + HtmlEncoder htmlEncoder, IViewComponentSelector selector, IViewComponentInvokerFactory invokerFactory) { @@ -28,6 +31,11 @@ namespace Microsoft.AspNet.Mvc.ViewComponents throw new ArgumentNullException(nameof(descriptorProvider)); } + if (htmlEncoder == null) + { + throw new ArgumentNullException(nameof(htmlEncoder)); + } + if (selector == null) { throw new ArgumentNullException(nameof(selector)); @@ -39,6 +47,7 @@ namespace Microsoft.AspNet.Mvc.ViewComponents } _descriptorProvider = descriptorProvider; + _htmlEncoder = htmlEncoder; _selector = selector; _invokerFactory = invokerFactory; } @@ -202,7 +211,7 @@ namespace Microsoft.AspNet.Mvc.ViewComponents throw new ArgumentNullException(nameof(descriptor)); } - var context = new ViewComponentContext(descriptor, arguments, _viewContext, writer); + var context = new ViewComponentContext(descriptor, arguments, _htmlEncoder, _viewContext, writer); var invoker = _invokerFactory.CreateInstance(context); if (invoker == null) @@ -229,7 +238,7 @@ namespace Microsoft.AspNet.Mvc.ViewComponents throw new ArgumentNullException(nameof(descriptor)); } - var context = new ViewComponentContext(descriptor, arguments, _viewContext, writer); + var context = new ViewComponentContext(descriptor, arguments, _htmlEncoder, _viewContext, writer); var invoker = _invokerFactory.CreateInstance(context); if (invoker == null) diff --git a/src/Microsoft.AspNet.Mvc.ViewFeatures/ViewComponents/DefaultViewComponentInvoker.cs b/src/Microsoft.AspNet.Mvc.ViewFeatures/ViewComponents/DefaultViewComponentInvoker.cs index e2c7aae80e..49bbf28101 100644 --- a/src/Microsoft.AspNet.Mvc.ViewFeatures/ViewComponents/DefaultViewComponentInvoker.cs +++ b/src/Microsoft.AspNet.Mvc.ViewFeatures/ViewComponents/DefaultViewComponentInvoker.cs @@ -6,10 +6,10 @@ using System.Diagnostics; using System.Reflection; using System.Runtime.ExceptionServices; using System.Threading.Tasks; +using Microsoft.AspNet.Html.Abstractions; using Microsoft.AspNet.Mvc.Controllers; using Microsoft.AspNet.Mvc.Diagnostics; using Microsoft.AspNet.Mvc.Infrastructure; -using Microsoft.AspNet.Mvc.Rendering; using Microsoft.AspNet.Mvc.ViewFeatures; using Microsoft.AspNet.Mvc.ViewFeatures.Logging; using Microsoft.Extensions.Logging; @@ -175,8 +175,6 @@ namespace Microsoft.AspNet.Mvc.ViewComponents var component = CreateComponent(context); - object result = null; - using (_logger.ViewComponentScope(context)) { _diagnosticSource.BeforeViewComponent(context, component); @@ -185,7 +183,7 @@ namespace Microsoft.AspNet.Mvc.ViewComponents try { var startTime = Environment.TickCount; - result = method.Invoke(component, context.Arguments); + var result = method.Invoke(component, context.Arguments); var viewComponentResult = CoerceToViewComponentResult(result); _logger.ViewComponentExecuted(context, startTime, viewComponentResult); @@ -222,15 +220,15 @@ namespace Microsoft.AspNet.Mvc.ViewComponents return new ContentViewComponentResult(stringResult); } - var htmlStringResult = value as HtmlString; - if (htmlStringResult != null) + var htmlContent = value as IHtmlContent; + if (htmlContent != null) { - return new ContentViewComponentResult(htmlStringResult); + return new HtmlContentViewComponentResult(htmlContent); } throw new InvalidOperationException(Resources.FormatViewComponent_InvalidReturnValue( typeof(string).Name, - typeof(HtmlString).Name, + typeof(IHtmlContent).Name, typeof(IViewComponentResult).Name)); } } diff --git a/src/Microsoft.AspNet.Mvc.ViewFeatures/ViewComponents/HtmlContentViewComponentResult.cs b/src/Microsoft.AspNet.Mvc.ViewFeatures/ViewComponents/HtmlContentViewComponentResult.cs new file mode 100644 index 0000000000..0f7af8164a --- /dev/null +++ b/src/Microsoft.AspNet.Mvc.ViewFeatures/ViewComponents/HtmlContentViewComponentResult.cs @@ -0,0 +1,72 @@ +// Copyright (c) .NET Foundation. 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.Threading.Tasks; +using Microsoft.AspNet.Html.Abstractions; +using Microsoft.AspNet.Mvc.Internal; + +namespace Microsoft.AspNet.Mvc.ViewComponents +{ + /// + /// An which writes an when executed. + /// + /// + /// The provided content will be HTML-encoded as specified when the content was created. To encoded and write + /// text, use a . + /// + public class HtmlContentViewComponentResult : IViewComponentResult + { + /// + /// Initializes a new . + /// + public HtmlContentViewComponentResult(IHtmlContent encodedContent) + { + if (encodedContent == null) + { + throw new ArgumentNullException(nameof(encodedContent)); + } + + EncodedContent = encodedContent; + } + + /// + /// Gets the encoded content. + /// + public IHtmlContent EncodedContent { get; } + + /// + /// Writes the . + /// + /// The . + public void Execute(ViewComponentContext context) + { + if (context == null) + { + throw new ArgumentNullException(nameof(context)); + } + + var htmlWriter = context.Writer as HtmlTextWriter; + if (htmlWriter == null) + { + EncodedContent.WriteTo(context.Writer, context.HtmlEncoder); + } + else + { + htmlWriter.Write(EncodedContent); + } + } + + /// + /// Writes the . + /// + /// The . + /// A completed . + public Task ExecuteAsync(ViewComponentContext context) + { + Execute(context); + + return TaskCache.CompletedTask; + } + } +} diff --git a/src/Microsoft.AspNet.Mvc.ViewFeatures/ViewComponents/ViewComponentContext.cs b/src/Microsoft.AspNet.Mvc.ViewFeatures/ViewComponents/ViewComponentContext.cs index 4029fd929e..699fecaf89 100644 --- a/src/Microsoft.AspNet.Mvc.ViewFeatures/ViewComponents/ViewComponentContext.cs +++ b/src/Microsoft.AspNet.Mvc.ViewFeatures/ViewComponents/ViewComponentContext.cs @@ -3,6 +3,7 @@ using System; using System.IO; +using System.Text.Encodings.Web; using Microsoft.AspNet.Mvc.Rendering; using Microsoft.AspNet.Mvc.ViewFeatures; @@ -38,6 +39,7 @@ namespace Microsoft.AspNet.Mvc.ViewComponents public ViewComponentContext( ViewComponentDescriptor viewComponentDescriptor, object[] arguments, + HtmlEncoder htmlEncoder, ViewContext viewContext, TextWriter writer) { @@ -51,6 +53,11 @@ namespace Microsoft.AspNet.Mvc.ViewComponents throw new ArgumentNullException(nameof(arguments)); } + if (htmlEncoder == null) + { + throw new ArgumentNullException(nameof(htmlEncoder)); + } + if (viewContext == null) { throw new ArgumentNullException(nameof(viewContext)); @@ -63,6 +70,7 @@ namespace Microsoft.AspNet.Mvc.ViewComponents ViewComponentDescriptor = viewComponentDescriptor; Arguments = arguments; + HtmlEncoder = htmlEncoder; // We want to create a defensive copy of the VDD here so that changes done in the VC // aren't visible in the calling view. @@ -74,13 +82,21 @@ namespace Microsoft.AspNet.Mvc.ViewComponents } /// - /// Gets or sets the View Component arguments. + /// Gets or sets the View Component arguments. /// /// /// The property setter is provided for unit test purposes only. /// public object[] Arguments { get; set; } + /// + /// Gets or sets the . + /// + /// + /// The property setter is provided for unit test purposes only. + /// + public HtmlEncoder HtmlEncoder { get; set; } + /// /// Gets or sets the for the View Component being invoked. /// diff --git a/src/Microsoft.AspNet.Mvc.ViewFeatures/ViewFeatures/DefaultEditorTemplates.cs b/src/Microsoft.AspNet.Mvc.ViewFeatures/ViewFeatures/DefaultEditorTemplates.cs index ece0d2524f..0bf43fca6c 100644 --- a/src/Microsoft.AspNet.Mvc.ViewFeatures/ViewFeatures/DefaultEditorTemplates.cs +++ b/src/Microsoft.AspNet.Mvc.ViewFeatures/ViewFeatures/DefaultEditorTemplates.cs @@ -12,7 +12,6 @@ using Microsoft.AspNet.Mvc.Rendering; using Microsoft.AspNet.Mvc.ViewEngines; using Microsoft.AspNet.Mvc.ViewFeatures.Internal; using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Internal; namespace Microsoft.AspNet.Mvc.ViewFeatures { diff --git a/src/Microsoft.AspNet.Mvc.ViewFeatures/ViewFeatures/DefaultHtmlGenerator.cs b/src/Microsoft.AspNet.Mvc.ViewFeatures/ViewFeatures/DefaultHtmlGenerator.cs index 9f1e9e9f36..fba7470525 100644 --- a/src/Microsoft.AspNet.Mvc.ViewFeatures/ViewFeatures/DefaultHtmlGenerator.cs +++ b/src/Microsoft.AspNet.Mvc.ViewFeatures/ViewFeatures/DefaultHtmlGenerator.cs @@ -15,7 +15,6 @@ using Microsoft.AspNet.Mvc.ModelBinding; using Microsoft.AspNet.Mvc.ModelBinding.Validation; using Microsoft.AspNet.Mvc.Rendering; using Microsoft.AspNet.Mvc.ViewFeatures.Internal; -using Microsoft.Extensions.Internal; using Microsoft.Extensions.OptionsModel; namespace Microsoft.AspNet.Mvc.ViewFeatures diff --git a/test/Microsoft.AspNet.Mvc.ViewFeatures.Test/ViewComponentResultTest.cs b/test/Microsoft.AspNet.Mvc.ViewFeatures.Test/ViewComponentResultTest.cs index 6ee708a612..dd02c9c8e2 100644 --- a/test/Microsoft.AspNet.Mvc.ViewFeatures.Test/ViewComponentResultTest.cs +++ b/test/Microsoft.AspNet.Mvc.ViewFeatures.Test/ViewComponentResultTest.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Text; +using System.Text.Encodings.Web; using System.Threading.Tasks; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Internal; @@ -20,6 +21,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Testing; using Microsoft.Extensions.OptionsModel; +using Microsoft.Extensions.WebEncoders.Testing; using Microsoft.Net.Http.Headers; using Xunit; @@ -480,6 +482,7 @@ namespace Microsoft.AspNet.Mvc services.AddSingleton(NullLoggerFactory.Instance); services.AddSingleton(new TempDataDictionary(httpContext, tempDataProvider)); services.AddTransient(); + services.AddSingleton(); return services; } diff --git a/test/Microsoft.AspNet.Mvc.ViewFeatures.Test/ViewComponentTests.cs b/test/Microsoft.AspNet.Mvc.ViewFeatures.Test/ViewComponentTests.cs index 561bce7dd1..a791979502 100644 --- a/test/Microsoft.AspNet.Mvc.ViewFeatures.Test/ViewComponentTests.cs +++ b/test/Microsoft.AspNet.Mvc.ViewFeatures.Test/ViewComponentTests.cs @@ -65,7 +65,6 @@ namespace Microsoft.AspNet.Mvc // Assert Assert.IsType(actualResult); Assert.Same(expectedContent, actualResult.Content); - Assert.Equal(expectedEncodedContent.ToString(), actualResult.EncodedContent.ToString()); } [Fact] diff --git a/test/Microsoft.AspNet.Mvc.ViewFeatures.Test/ViewComponents/ContentViewComponentResultTest.cs b/test/Microsoft.AspNet.Mvc.ViewFeatures.Test/ViewComponents/ContentViewComponentResultTest.cs index c6ed6613f8..ee447c033d 100644 --- a/test/Microsoft.AspNet.Mvc.ViewFeatures.Test/ViewComponents/ContentViewComponentResultTest.cs +++ b/test/Microsoft.AspNet.Mvc.ViewFeatures.Test/ViewComponents/ContentViewComponentResultTest.cs @@ -11,6 +11,7 @@ using Microsoft.AspNet.Mvc.ViewComponents; using Microsoft.AspNet.Mvc.ViewEngines; using Microsoft.AspNet.Mvc.ViewFeatures; using Microsoft.AspNet.Routing; +using Microsoft.Extensions.WebEncoders.Testing; using Moq; using Xunit; @@ -32,26 +33,7 @@ namespace Microsoft.AspNet.Mvc buffer.Position = 0; // Assert - Assert.Equal("<Test />", result.EncodedContent.ToString()); - Assert.Equal("<Test />", new StreamReader(buffer).ReadToEnd()); - } - - [Fact] - public void Execute_WritesData_PreEncoded() - { - // Arrange - var buffer = new MemoryStream(); - var viewComponentContext = GetViewComponentContext(Mock.Of(), buffer); - - var result = new ContentViewComponentResult(new HtmlString("")); - - // Act - result.Execute(viewComponentContext); - buffer.Position = 0; - - // Assert - Assert.Equal("", result.Content); - Assert.Equal("", new StreamReader(buffer).ReadToEnd()); + Assert.Equal("HtmlEncode[[]]", new StreamReader(buffer).ReadToEnd()); } private static ViewComponentContext GetViewComponentContext(IView view, Stream stream) @@ -61,7 +43,7 @@ namespace Microsoft.AspNet.Mvc var viewContext = new ViewContext( actionContext, view, - viewData, + viewData, new TempDataDictionary(new HttpContextAccessor(), new SessionStateTempDataProvider()), TextWriter.Null, new HtmlHelperOptions()); @@ -73,7 +55,13 @@ namespace Microsoft.AspNet.Mvc Type = typeof(object), }; - var viewComponentContext = new ViewComponentContext(viewComponentDescriptor, new object[0], viewContext, writer); + var viewComponentContext = new ViewComponentContext( + viewComponentDescriptor, + new object[0], + new HtmlTestEncoder(), + viewContext, + writer); + return viewComponentContext; } } diff --git a/test/Microsoft.AspNet.Mvc.ViewFeatures.Test/ViewComponents/HtmlContentViewComponentResultTest.cs b/test/Microsoft.AspNet.Mvc.ViewFeatures.Test/ViewComponents/HtmlContentViewComponentResultTest.cs new file mode 100644 index 0000000000..e57a55d89b --- /dev/null +++ b/test/Microsoft.AspNet.Mvc.ViewFeatures.Test/ViewComponents/HtmlContentViewComponentResultTest.cs @@ -0,0 +1,69 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +#if MOCK_SUPPORT +using System.IO; +using Microsoft.AspNet.Http.Internal; +using Microsoft.AspNet.Mvc.Abstractions; +using Microsoft.AspNet.Mvc.ModelBinding; +using Microsoft.AspNet.Mvc.Rendering; +using Microsoft.AspNet.Mvc.ViewComponents; +using Microsoft.AspNet.Mvc.ViewEngines; +using Microsoft.AspNet.Mvc.ViewFeatures; +using Microsoft.AspNet.Routing; +using Microsoft.Extensions.WebEncoders.Testing; +using Moq; +using Xunit; + +namespace Microsoft.AspNet.Mvc +{ + public class HtmlContentViewComponentResultTest + { + [Fact] + public void Execute_WritesData_PreEncoded() + { + // Arrange + var buffer = new MemoryStream(); + var viewComponentContext = GetViewComponentContext(Mock.Of(), buffer); + + var result = new HtmlContentViewComponentResult(new HtmlString("")); + + // Act + result.Execute(viewComponentContext); + buffer.Position = 0; + + // Assert + Assert.Equal("", new StreamReader(buffer).ReadToEnd()); + } + + private static ViewComponentContext GetViewComponentContext(IView view, Stream stream) + { + var actionContext = new ActionContext(new DefaultHttpContext(), new RouteData(), new ActionDescriptor()); + var viewData = new ViewDataDictionary(new EmptyModelMetadataProvider()); + var viewContext = new ViewContext( + actionContext, + view, + viewData, + new TempDataDictionary(new HttpContextAccessor(), new SessionStateTempDataProvider()), + TextWriter.Null, + new HtmlHelperOptions()); + + var writer = new StreamWriter(stream) { AutoFlush = true }; + + var viewComponentDescriptor = new ViewComponentDescriptor() + { + Type = typeof(object), + }; + + var viewComponentContext = new ViewComponentContext( + viewComponentDescriptor, + new object[0], + new HtmlTestEncoder(), + viewContext, + writer); + + return viewComponentContext; + } + } +} +#endif \ No newline at end of file diff --git a/test/Microsoft.AspNet.Mvc.ViewFeatures.Test/ViewComponents/JsonViewComponentResultTest.cs b/test/Microsoft.AspNet.Mvc.ViewFeatures.Test/ViewComponents/JsonViewComponentResultTest.cs index 9ac6436613..904cc757cd 100644 --- a/test/Microsoft.AspNet.Mvc.ViewFeatures.Test/ViewComponents/JsonViewComponentResultTest.cs +++ b/test/Microsoft.AspNet.Mvc.ViewFeatures.Test/ViewComponents/JsonViewComponentResultTest.cs @@ -15,6 +15,7 @@ using Microsoft.AspNet.Mvc.ViewEngines; using Microsoft.AspNet.Mvc.ViewFeatures; using Microsoft.AspNet.Routing; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.WebEncoders.Testing; using Moq; using Newtonsoft.Json; using Xunit; @@ -83,7 +84,13 @@ namespace Microsoft.AspNet.Mvc Type = typeof(object), }; - var viewComponentContext = new ViewComponentContext(viewComponentDescriptor, new object[0], viewContext, writer); + var viewComponentContext = new ViewComponentContext( + viewComponentDescriptor, + new object[0], + new HtmlTestEncoder(), + viewContext, + writer); + return viewComponentContext; } diff --git a/test/Microsoft.AspNet.Mvc.ViewFeatures.Test/ViewComponents/ViewViewComponentResultTest.cs b/test/Microsoft.AspNet.Mvc.ViewFeatures.Test/ViewComponents/ViewViewComponentResultTest.cs index 8856cbb5a1..2ca3123db3 100644 --- a/test/Microsoft.AspNet.Mvc.ViewFeatures.Test/ViewComponents/ViewViewComponentResultTest.cs +++ b/test/Microsoft.AspNet.Mvc.ViewFeatures.Test/ViewComponents/ViewViewComponentResultTest.cs @@ -16,6 +16,7 @@ using Microsoft.AspNet.Mvc.ViewEngines; using Microsoft.AspNet.Mvc.ViewFeatures; using Microsoft.AspNet.Routing; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.WebEncoders.Testing; using Moq; using Xunit; @@ -540,6 +541,7 @@ namespace Microsoft.AspNet.Mvc var viewComponentContext = new ViewComponentContext( viewComponentDescriptor, new object[0], + new HtmlTestEncoder(), viewContext, TextWriter.Null); diff --git a/test/WebSites/TagHelpersWebSite/TagHelpers/TagCloudViewComponentTagHelper.cs b/test/WebSites/TagHelpersWebSite/TagHelpers/TagCloudViewComponentTagHelper.cs index 6b922a9dcd..792b4efe26 100644 --- a/test/WebSites/TagHelpersWebSite/TagHelpers/TagCloudViewComponentTagHelper.cs +++ b/test/WebSites/TagHelpersWebSite/TagHelpers/TagCloudViewComponentTagHelper.cs @@ -4,6 +4,7 @@ using System; using System.IO; using System.Linq; +using System.Text.Encodings.Web; using System.Threading.Tasks; using Microsoft.AspNet.Mvc; using Microsoft.AspNet.Mvc.Rendering; @@ -24,6 +25,12 @@ namespace MvcSample.Web.Components "non proident, sunt in culpa qui officia deserunt mollit anim id est laborum") .Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries) .ToArray(); + private readonly HtmlEncoder _htmlEncoder; + + public TagCloudViewComponentTagHelper(HtmlEncoder htmlEncoder) + { + _htmlEncoder = htmlEncoder; + } public int Count { get; set; } @@ -52,6 +59,7 @@ namespace MvcSample.Web.Components await result.ExecuteAsync(new ViewComponentContext( viewComponentDescriptor, new object[0], + _htmlEncoder, ViewContext, writer));