From af5322e2ce295c9156e8422fbdfec0327b1cdb85 Mon Sep 17 00:00:00 2001 From: Ryan Nowak Date: Thu, 21 May 2015 11:00:39 -0700 Subject: [PATCH] Part of #2151 - Remove [Activate] from TagHelpers This change removes [Activate] support from TagHelpers. TagHelpers which need access to context should use [ViewContext] to have it injected. To access services, use constructor injection. --- .../ViewContextAttribute.cs | 17 ++ .../DefaultTagHelperActivator.cs | 36 +---- src/Microsoft.AspNet.Mvc.Razor/RazorPage.cs | 25 ++- .../AnchorTagHelper.cs | 13 +- .../CacheTagHelper.cs | 17 +- .../EnvironmentTagHelper.cs | 13 +- .../FormTagHelper.cs | 15 +- .../ImageTagHelper.cs | 22 ++- .../InputTagHelper.cs | 15 +- .../LabelTagHelper.cs | 15 +- .../LinkTagHelper.cs | 74 +++++---- .../OptionTagHelper.cs | 15 +- .../ScriptTagHelper.cs | 74 +++++---- .../SelectTagHelper.cs | 15 +- .../TextAreaTagHelper.cs | 15 +- .../ValidationMessageTagHelper.cs | 15 +- .../ValidationSummaryTagHelper.cs | 14 +- .../ActivatorTests.cs | 2 +- .../DefaultTagHelperActivatorTest.cs | 4 +- .../RazorPageCreateTagHelperTest.cs | 76 ++------- .../AnchorTagHelperTest.cs | 21 ++- .../CacheTagHelperTest.cs | 80 ++++----- .../EnvironmentTagHelperTest.cs | 6 +- .../FormTagHelperTest.cs | 22 +-- .../ImageTagHelperTest.cs | 20 +-- .../InputTagHelperTest.cs | 3 +- .../LabelTagHelperTest.cs | 7 +- .../LinkTagHelperTest.cs | 121 ++++++++------ .../OptionTagHelperTest.cs | 13 +- .../ScriptTagHelperTest.cs | 153 ++++++++++-------- .../SelectTagHelperTest.cs | 17 +- .../TextAreaTagHelperTest.cs | 18 +-- .../ValidationMessageTagHelperTest.cs | 100 ++++++------ .../ValidationSummaryTagHelperTest.cs | 118 +++++++------- .../TagHelpers/FooterTagHelper.cs | 17 +- .../TagHelpers/HiddenTagHelper.cs | 16 +- .../TagHelpers/RepeatContentTagHelper.cs | 16 +- .../TagHelpers/TitleTagHelper.cs | 14 +- .../RequestScopedTagHelper.cs | 10 +- .../TagHelpers/ATagHelper.cs | 8 +- .../TagHelpers/PrettyTagHelper.cs | 2 +- .../TagCloudViewComponentTagHelper.cs | 2 +- 42 files changed, 694 insertions(+), 582 deletions(-) create mode 100644 src/Microsoft.AspNet.Mvc.Core/ViewContextAttribute.cs diff --git a/src/Microsoft.AspNet.Mvc.Core/ViewContextAttribute.cs b/src/Microsoft.AspNet.Mvc.Core/ViewContextAttribute.cs new file mode 100644 index 0000000000..5685dd2e39 --- /dev/null +++ b/src/Microsoft.AspNet.Mvc.Core/ViewContextAttribute.cs @@ -0,0 +1,17 @@ +// 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; + +namespace Microsoft.AspNet.Mvc +{ + /// + /// Specifies that a tag helper property should be set with the current + /// when creating the tag helper. The property must have a public + /// set method. + /// + [AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)] + public class ViewContextAttribute : Attribute + { + } +} diff --git a/src/Microsoft.AspNet.Mvc.Razor/DefaultTagHelperActivator.cs b/src/Microsoft.AspNet.Mvc.Razor/DefaultTagHelperActivator.cs index 7515d1049d..4a41085893 100644 --- a/src/Microsoft.AspNet.Mvc.Razor/DefaultTagHelperActivator.cs +++ b/src/Microsoft.AspNet.Mvc.Razor/DefaultTagHelperActivator.cs @@ -26,15 +26,18 @@ namespace Microsoft.AspNet.Mvc.Razor _injectActions = new ConcurrentDictionary[]>(); _getPropertiesToActivate = type => PropertyActivator.GetPropertiesToActivate( - type, typeof(ActivateAttribute), CreateActivateInfo); + type, + typeof(ViewContextAttribute), + CreateActivateInfo); } /// public void Activate([NotNull] TTagHelper tagHelper, [NotNull] ViewContext context) where TTagHelper : ITagHelper { - var propertiesToActivate = _injectActions.GetOrAdd(tagHelper.GetType(), - _getPropertiesToActivate); + var propertiesToActivate = _injectActions.GetOrAdd( + tagHelper.GetType(), + _getPropertiesToActivate); for (var i = 0; i < propertiesToActivate.Length; i++) { @@ -60,32 +63,7 @@ namespace Microsoft.AspNet.Mvc.Razor private static PropertyActivator CreateActivateInfo(PropertyInfo property) { - Func valueAccessor; - var propertyType = property.PropertyType; - - if (propertyType == typeof(ViewContext)) - { - valueAccessor = viewContext => viewContext; - } - else if (propertyType == typeof(ViewDataDictionary)) - { - valueAccessor = viewContext => viewContext.ViewData; - } - else - { - valueAccessor = (viewContext) => - { - var serviceProvider = viewContext.HttpContext.RequestServices; - var service = serviceProvider.GetRequiredService(propertyType); - - var contextable = service as ICanHasViewContext; - contextable?.Contextualize(viewContext); - - return service; - }; - } - - return new PropertyActivator(property, valueAccessor); + return new PropertyActivator(property, viewContext => viewContext); } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Mvc.Razor/RazorPage.cs b/src/Microsoft.AspNet.Mvc.Razor/RazorPage.cs index 0263cccfc9..3ab6edb827 100644 --- a/src/Microsoft.AspNet.Mvc.Razor/RazorPage.cs +++ b/src/Microsoft.AspNet.Mvc.Razor/RazorPage.cs @@ -29,6 +29,7 @@ namespace Microsoft.AspNet.Mvc.Razor private TextWriter _originalWriter; private IUrlHelper _urlHelper; private ITagHelperActivator _tagHelperActivator; + private ITypeActivatorCache _typeActivatorCache; private bool _renderedBody; public RazorPage() @@ -143,14 +144,28 @@ namespace Microsoft.AspNet.Mvc.Razor { if (_tagHelperActivator == null) { - _tagHelperActivator = - ViewContext.HttpContext.RequestServices.GetRequiredService(); + var services = ViewContext.HttpContext.RequestServices; + _tagHelperActivator = services.GetRequiredService(); } return _tagHelperActivator; } } + private ITypeActivatorCache TypeActivatorCache + { + get + { + if (_typeActivatorCache == null) + { + var services = ViewContext.HttpContext.RequestServices; + _typeActivatorCache = services.GetRequiredService(); + } + + return _typeActivatorCache; + } + } + /// /// Format an error message about using an indexer when the tag helper property is null. /// @@ -177,9 +192,11 @@ namespace Microsoft.AspNet.Mvc.Razor /// /// must have a parameterless constructor. /// - public TTagHelper CreateTagHelper() where TTagHelper : ITagHelper, new() + public TTagHelper CreateTagHelper() where TTagHelper : ITagHelper { - var tagHelper = new TTagHelper(); + var tagHelper = TypeActivatorCache.CreateInstance( + ViewContext.HttpContext.RequestServices, + typeof(TTagHelper)); TagHelperActivator.Activate(tagHelper, ViewContext); diff --git a/src/Microsoft.AspNet.Mvc.TagHelpers/AnchorTagHelper.cs b/src/Microsoft.AspNet.Mvc.TagHelpers/AnchorTagHelper.cs index 8d218a64d6..d25a6949fe 100644 --- a/src/Microsoft.AspNet.Mvc.TagHelpers/AnchorTagHelper.cs +++ b/src/Microsoft.AspNet.Mvc.TagHelpers/AnchorTagHelper.cs @@ -32,9 +32,16 @@ namespace Microsoft.AspNet.Mvc.TagHelpers private const string RouteValuesPrefix = "asp-route-"; private const string Href = "href"; - [Activate] - [HtmlAttributeNotBound] - public IHtmlGenerator Generator { get; set; } + /// + /// Creates a new . + /// + /// The . + public AnchorTagHelper(IHtmlGenerator generator) + { + Generator = generator; + } + + protected IHtmlGenerator Generator { get; } /// /// The name of the action method. diff --git a/src/Microsoft.AspNet.Mvc.TagHelpers/CacheTagHelper.cs b/src/Microsoft.AspNet.Mvc.TagHelpers/CacheTagHelper.cs index 7d4f72a415..1394d250ba 100644 --- a/src/Microsoft.AspNet.Mvc.TagHelpers/CacheTagHelper.cs +++ b/src/Microsoft.AspNet.Mvc.TagHelpers/CacheTagHelper.cs @@ -37,17 +37,24 @@ namespace Microsoft.AspNet.Mvc.TagHelpers private static readonly char[] AttributeSeparator = new[] { ',' }; /// - /// Gets or sets the instance used to cache entries. + /// Creates a new . /// - [Activate] - [HtmlAttributeNotBound] - public IMemoryCache MemoryCache { get; set; } + /// The . + public CacheTagHelper(IMemoryCache memoryCache) + { + MemoryCache = memoryCache; + } + + /// + /// Gets the instance used to cache entries. + /// + protected IMemoryCache MemoryCache { get; } /// /// Gets or sets the for the current executing View. /// - [Activate] [HtmlAttributeNotBound] + [ViewContext] public ViewContext ViewContext { get; set; } /// diff --git a/src/Microsoft.AspNet.Mvc.TagHelpers/EnvironmentTagHelper.cs b/src/Microsoft.AspNet.Mvc.TagHelpers/EnvironmentTagHelper.cs index 1d9d511162..c2b8450ec2 100644 --- a/src/Microsoft.AspNet.Mvc.TagHelpers/EnvironmentTagHelper.cs +++ b/src/Microsoft.AspNet.Mvc.TagHelpers/EnvironmentTagHelper.cs @@ -16,6 +16,15 @@ namespace Microsoft.AspNet.Mvc.TagHelpers { private static readonly char[] NameSeparator = new[] { ',' }; + /// + /// Creates a new . + /// + /// The . + public EnvironmentTagHelper(IHostingEnvironment hostingEnvironment) + { + HostingEnvironment = hostingEnvironment; + } + /// /// A comma separated list of environment names in which the content should be rendered. /// @@ -25,9 +34,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers /// public string Names { get; set; } - [Activate] - [HtmlAttributeNotBound] - public IHostingEnvironment HostingEnvironment { get; set; } + protected IHostingEnvironment HostingEnvironment { get; } /// public override void Process(TagHelperContext context, TagHelperOutput output) diff --git a/src/Microsoft.AspNet.Mvc.TagHelpers/FormTagHelper.cs b/src/Microsoft.AspNet.Mvc.TagHelpers/FormTagHelper.cs index b9cedf9c04..87fd6f7b40 100644 --- a/src/Microsoft.AspNet.Mvc.TagHelpers/FormTagHelper.cs +++ b/src/Microsoft.AspNet.Mvc.TagHelpers/FormTagHelper.cs @@ -28,13 +28,20 @@ namespace Microsoft.AspNet.Mvc.TagHelpers private const string RouteValuesPrefix = "asp-route-"; private const string HtmlActionAttributeName = "action"; - [Activate] + /// + /// Creates a new . + /// + /// The . + public FormTagHelper(IHtmlGenerator generator) + { + Generator = generator; + } + [HtmlAttributeNotBound] + [ViewContext] public ViewContext ViewContext { get; set; } - [Activate] - [HtmlAttributeNotBound] - public IHtmlGenerator Generator { get; set; } + protected IHtmlGenerator Generator { get; } /// /// The name of the action method. diff --git a/src/Microsoft.AspNet.Mvc.TagHelpers/ImageTagHelper.cs b/src/Microsoft.AspNet.Mvc.TagHelpers/ImageTagHelper.cs index 7cb42ddf71..cdd1496453 100644 --- a/src/Microsoft.AspNet.Mvc.TagHelpers/ImageTagHelper.cs +++ b/src/Microsoft.AspNet.Mvc.TagHelpers/ImageTagHelper.cs @@ -25,6 +25,17 @@ namespace Microsoft.AspNet.Mvc.TagHelpers private FileVersionProvider _fileVersionProvider; + /// + /// Creates a new . + /// + /// The . + /// The . + public ImageTagHelper(IHostingEnvironment hostingEnvironment, IMemoryCache cache) + { + HostingEnvironment = hostingEnvironment; + Cache = cache; + } + /// /// Source of the image. /// @@ -43,17 +54,12 @@ namespace Microsoft.AspNet.Mvc.TagHelpers [HtmlAttributeName(FileVersionAttributeName)] public bool FileVersion { get; set; } - [Activate] - [HtmlAttributeNotBound] - public IHostingEnvironment HostingEnvironment { get; set; } + protected IHostingEnvironment HostingEnvironment { get; } - [Activate] - [HtmlAttributeNotBound] + [ViewContext] public ViewContext ViewContext { get; set; } - [Activate] - [HtmlAttributeNotBound] - public IMemoryCache Cache { get; set; } + protected IMemoryCache Cache { get; } /// public override void Process(TagHelperContext context, TagHelperOutput output) diff --git a/src/Microsoft.AspNet.Mvc.TagHelpers/InputTagHelper.cs b/src/Microsoft.AspNet.Mvc.TagHelpers/InputTagHelper.cs index 872fdb720b..c6cc959b87 100644 --- a/src/Microsoft.AspNet.Mvc.TagHelpers/InputTagHelper.cs +++ b/src/Microsoft.AspNet.Mvc.TagHelpers/InputTagHelper.cs @@ -62,12 +62,19 @@ namespace Microsoft.AspNet.Mvc.TagHelpers { "time", "{0:HH:mm:ss.fff}" }, }; - [Activate] - [HtmlAttributeNotBound] - public IHtmlGenerator Generator { get; set; } + /// + /// Creates a new . + /// + /// The . + public InputTagHelper(IHtmlGenerator generator) + { + Generator = generator; + } + + protected IHtmlGenerator Generator { get; } - [Activate] [HtmlAttributeNotBound] + [ViewContext] public ViewContext ViewContext { get; set; } /// diff --git a/src/Microsoft.AspNet.Mvc.TagHelpers/LabelTagHelper.cs b/src/Microsoft.AspNet.Mvc.TagHelpers/LabelTagHelper.cs index 1ad209a18c..5ce55c5e29 100644 --- a/src/Microsoft.AspNet.Mvc.TagHelpers/LabelTagHelper.cs +++ b/src/Microsoft.AspNet.Mvc.TagHelpers/LabelTagHelper.cs @@ -15,13 +15,20 @@ namespace Microsoft.AspNet.Mvc.TagHelpers { private const string ForAttributeName = "asp-for"; - [Activate] + /// + /// Creates a new . + /// + /// The . + public LabelTagHelper(IHtmlGenerator generator) + { + Generator = generator; + } + [HtmlAttributeNotBound] + [ViewContext] public ViewContext ViewContext { get; set; } - [Activate] - [HtmlAttributeNotBound] - public IHtmlGenerator Generator { get; set; } + protected IHtmlGenerator Generator { get; } /// /// An expression to be evaluated against the current model. diff --git a/src/Microsoft.AspNet.Mvc.TagHelpers/LinkTagHelper.cs b/src/Microsoft.AspNet.Mvc.TagHelpers/LinkTagHelper.cs index d713110038..6619deaaa1 100644 --- a/src/Microsoft.AspNet.Mvc.TagHelpers/LinkTagHelper.cs +++ b/src/Microsoft.AspNet.Mvc.TagHelpers/LinkTagHelper.cs @@ -83,21 +83,26 @@ namespace Microsoft.AspNet.Mvc.TagHelpers }), }; - private enum Mode + /// + /// Creates a new . + /// + /// The . + /// The . + /// The . + /// The . + /// The . + public LinkTagHelper( + ILogger logger, + IHostingEnvironment hostingEnvironment, + IMemoryCache cache, + IHtmlEncoder htmlEncoder, + IJavaScriptStringEncoder javaScriptEncoder) { - /// - /// Just adding a file version for the generated urls. - /// - FileVersion = 0, - /// - /// Just performing file globbing search for the href, rendering a separate <link> for each match. - /// - GlobbedHref = 1, - /// - /// Rendering a fallback block if primary stylesheet fails to load. Will also do globbing for both the - /// primary and fallback hrefs if the appropriate properties are set. - /// - Fallback = 2, + Logger = logger; + HostingEnvironment = hostingEnvironment; + Cache = cache; + HtmlEncoder = htmlEncoder; + JavaScriptEncoder = javaScriptEncoder; } /// @@ -180,29 +185,19 @@ namespace Microsoft.AspNet.Mvc.TagHelpers [HtmlAttributeName(FallbackTestValueAttributeName)] public string FallbackTestValue { get; set; } - [Activate] - [HtmlAttributeNotBound] - protected internal ILogger Logger { get; set; } + protected ILogger Logger { get; } - [Activate] - [HtmlAttributeNotBound] - public IHostingEnvironment HostingEnvironment { get; set; } + protected IHostingEnvironment HostingEnvironment { get; } - [Activate] [HtmlAttributeNotBound] + [ViewContext] public ViewContext ViewContext { get; set; } - [Activate] - [HtmlAttributeNotBound] - public IMemoryCache Cache { get; set; } + protected IMemoryCache Cache { get; } - [Activate] - [HtmlAttributeNotBound] - public IHtmlEncoder HtmlEncoder { get; set; } + protected IHtmlEncoder HtmlEncoder { get; } - [Activate] - [HtmlAttributeNotBound] - public IJavaScriptStringEncoder JavaScriptEncoder { get; set; } + protected IJavaScriptStringEncoder JavaScriptEncoder { get; } // Internal for ease of use when testing. protected internal GlobbingUrlBuilder GlobbingUrlBuilder { get; set; } @@ -365,5 +360,24 @@ namespace Microsoft.AspNet.Mvc.TagHelpers builder.Append("/>"); } + + private enum Mode + { + /// + /// Just adding a file version for the generated urls. + /// + FileVersion = 0, + + /// + /// Just performing file globbing search for the href, rendering a separate <link> for each match. + /// + GlobbedHref = 1, + + /// + /// Rendering a fallback block if primary stylesheet fails to load. Will also do globbing for both the + /// primary and fallback hrefs if the appropriate properties are set. + /// + Fallback = 2, + } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Mvc.TagHelpers/OptionTagHelper.cs b/src/Microsoft.AspNet.Mvc.TagHelpers/OptionTagHelper.cs index 5cae58bb04..53d24ef921 100644 --- a/src/Microsoft.AspNet.Mvc.TagHelpers/OptionTagHelper.cs +++ b/src/Microsoft.AspNet.Mvc.TagHelpers/OptionTagHelper.cs @@ -19,12 +19,19 @@ namespace Microsoft.AspNet.Mvc.TagHelpers /// public class OptionTagHelper : TagHelper { - [Activate] - [HtmlAttributeNotBound] - public IHtmlGenerator Generator { get; set; } + /// + /// Creates a new . + /// + /// The . + public OptionTagHelper(IHtmlGenerator generator) + { + Generator = generator; + } + + protected IHtmlGenerator Generator { get; } - [Activate] [HtmlAttributeNotBound] + [ViewContext] public ViewContext ViewContext { get; set; } /// diff --git a/src/Microsoft.AspNet.Mvc.TagHelpers/ScriptTagHelper.cs b/src/Microsoft.AspNet.Mvc.TagHelpers/ScriptTagHelper.cs index 3b213e0f97..8b278a1e59 100644 --- a/src/Microsoft.AspNet.Mvc.TagHelpers/ScriptTagHelper.cs +++ b/src/Microsoft.AspNet.Mvc.TagHelpers/ScriptTagHelper.cs @@ -70,21 +70,26 @@ namespace Microsoft.AspNet.Mvc.TagHelpers }), }; - private enum Mode + /// + /// Creates a new . + /// + /// The . + /// The . + /// The . + /// The . + /// The . + public ScriptTagHelper( + ILogger logger, + IHostingEnvironment hostingEnvironment, + IMemoryCache cache, + IHtmlEncoder htmlEncoder, + IJavaScriptStringEncoder javaScriptEncoder) { - /// - /// Just adding a file version for the generated urls. - /// - FileVersion = 0, - /// - /// Just performing file globbing search for the src, rendering a separate <script> for each match. - /// - GlobbedSrc = 1, - /// - /// Rendering a fallback block if primary javascript fails to load. Will also do globbing for both the - /// primary and fallback srcs if the appropriate properties are set. - /// - Fallback = 2 + Logger = logger; + HostingEnvironment = hostingEnvironment; + Cache = cache; + HtmlEncoder = htmlEncoder; + JavaScriptEncoder = javaScriptEncoder; } /// @@ -149,29 +154,19 @@ namespace Microsoft.AspNet.Mvc.TagHelpers [HtmlAttributeName(FallbackTestExpressionAttributeName)] public string FallbackTestExpression { get; set; } - [Activate] - [HtmlAttributeNotBound] - protected internal ILogger Logger { get; set; } + protected ILogger Logger { get; } - [Activate] - [HtmlAttributeNotBound] - public IHostingEnvironment HostingEnvironment { get; set; } + protected IHostingEnvironment HostingEnvironment { get; } - [Activate] [HtmlAttributeNotBound] + [ViewContext] public ViewContext ViewContext { get; set; } - [Activate] - [HtmlAttributeNotBound] - public IMemoryCache Cache { get; set; } + protected IMemoryCache Cache { get; } - [Activate] - [HtmlAttributeNotBound] - public IHtmlEncoder HtmlEncoder { get; set; } + protected IHtmlEncoder HtmlEncoder { get; } - [Activate] - [HtmlAttributeNotBound] - public IJavaScriptStringEncoder JavaScriptEncoder { get; set; } + protected IJavaScriptStringEncoder JavaScriptEncoder { get; } // Internal for ease of use when testing. protected internal GlobbingUrlBuilder GlobbingUrlBuilder { get; set; } @@ -388,5 +383,24 @@ namespace Microsoft.AspNet.Mvc.TagHelpers .Append("\""); } } + + private enum Mode + { + /// + /// Just adding a file version for the generated urls. + /// + FileVersion = 0, + + /// + /// Just performing file globbing search for the src, rendering a separate <script> for each match. + /// + GlobbedSrc = 1, + + /// + /// Rendering a fallback block if primary javascript fails to load. Will also do globbing for both the + /// primary and fallback srcs if the appropriate properties are set. + /// + Fallback = 2 + } } } diff --git a/src/Microsoft.AspNet.Mvc.TagHelpers/SelectTagHelper.cs b/src/Microsoft.AspNet.Mvc.TagHelpers/SelectTagHelper.cs index d96a4dd040..4493fc16b5 100644 --- a/src/Microsoft.AspNet.Mvc.TagHelpers/SelectTagHelper.cs +++ b/src/Microsoft.AspNet.Mvc.TagHelpers/SelectTagHelper.cs @@ -31,12 +31,19 @@ namespace Microsoft.AspNet.Mvc.TagHelpers /// public static readonly string SelectedValuesFormDataKey = nameof(SelectTagHelper) + "-SelectedValues"; - [Activate] - [HtmlAttributeNotBound] - public IHtmlGenerator Generator { get; set; } + /// + /// Creates a new . + /// + /// The . + public SelectTagHelper(IHtmlGenerator generator) + { + Generator = generator; + } + + protected IHtmlGenerator Generator { get; } - [Activate] [HtmlAttributeNotBound] + [ViewContext] public ViewContext ViewContext { get; set; } /// diff --git a/src/Microsoft.AspNet.Mvc.TagHelpers/TextAreaTagHelper.cs b/src/Microsoft.AspNet.Mvc.TagHelpers/TextAreaTagHelper.cs index 47fbab0614..e04aa30c04 100644 --- a/src/Microsoft.AspNet.Mvc.TagHelpers/TextAreaTagHelper.cs +++ b/src/Microsoft.AspNet.Mvc.TagHelpers/TextAreaTagHelper.cs @@ -14,12 +14,19 @@ namespace Microsoft.AspNet.Mvc.TagHelpers { private const string ForAttributeName = "asp-for"; - [Activate] - [HtmlAttributeNotBound] - public IHtmlGenerator Generator { get; set; } + /// + /// Creates a new . + /// + /// The . + public TextAreaTagHelper(IHtmlGenerator generator) + { + Generator = generator; + } + + protected IHtmlGenerator Generator { get; } - [Activate] [HtmlAttributeNotBound] + [ViewContext] public ViewContext ViewContext { get; set; } /// diff --git a/src/Microsoft.AspNet.Mvc.TagHelpers/ValidationMessageTagHelper.cs b/src/Microsoft.AspNet.Mvc.TagHelpers/ValidationMessageTagHelper.cs index 0dacdcc8d5..e7e537266d 100644 --- a/src/Microsoft.AspNet.Mvc.TagHelpers/ValidationMessageTagHelper.cs +++ b/src/Microsoft.AspNet.Mvc.TagHelpers/ValidationMessageTagHelper.cs @@ -16,13 +16,20 @@ namespace Microsoft.AspNet.Mvc.TagHelpers { private const string ValidationForAttributeName = "asp-validation-for"; - [Activate] + /// + /// Creates a new . + /// + /// The . + public ValidationMessageTagHelper(IHtmlGenerator generator) + { + Generator = generator; + } + [HtmlAttributeNotBound] + [ViewContext] public ViewContext ViewContext { get; set; } - [Activate] - [HtmlAttributeNotBound] - public IHtmlGenerator Generator { get; set; } + protected IHtmlGenerator Generator { get; } /// /// Name to be validated on the current model. diff --git a/src/Microsoft.AspNet.Mvc.TagHelpers/ValidationSummaryTagHelper.cs b/src/Microsoft.AspNet.Mvc.TagHelpers/ValidationSummaryTagHelper.cs index bfd73c635d..ed94593b83 100644 --- a/src/Microsoft.AspNet.Mvc.TagHelpers/ValidationSummaryTagHelper.cs +++ b/src/Microsoft.AspNet.Mvc.TagHelpers/ValidationSummaryTagHelper.cs @@ -17,13 +17,21 @@ namespace Microsoft.AspNet.Mvc.TagHelpers private const string ValidationSummaryAttributeName = "asp-validation-summary"; private ValidationSummary _validationSummary; - [Activate] + /// + /// Creates a new . + /// + /// The . + public ValidationSummaryTagHelper(IHtmlGenerator generator) + { + Generator = generator; + } + [HtmlAttributeNotBound] + [ViewContext] public ViewContext ViewContext { get; set; } - [Activate] [HtmlAttributeNotBound] - public IHtmlGenerator Generator { get; set; } + protected IHtmlGenerator Generator { get; } /// /// If or , appends a validation diff --git a/test/Microsoft.AspNet.Mvc.FunctionalTests/ActivatorTests.cs b/test/Microsoft.AspNet.Mvc.FunctionalTests/ActivatorTests.cs index a805193603..d1d44814a2 100644 --- a/test/Microsoft.AspNet.Mvc.FunctionalTests/ActivatorTests.cs +++ b/test/Microsoft.AspNet.Mvc.FunctionalTests/ActivatorTests.cs @@ -147,7 +147,7 @@ namespace Microsoft.AspNet.Mvc.FunctionalTests } [Fact] - public async Task TagHelperActivation_ActivateHtmlHelper_RendersProperly() + public async Task TagHelperActivation_ConstructorInjection_RendersProperly() { // Arrange var server = TestHelper.CreateServer(_app, SiteName, _configureServices); diff --git a/test/Microsoft.AspNet.Mvc.Razor.Test/DefaultTagHelperActivatorTest.cs b/test/Microsoft.AspNet.Mvc.Razor.Test/DefaultTagHelperActivatorTest.cs index 47b02340e2..842f93c274 100644 --- a/test/Microsoft.AspNet.Mvc.Razor.Test/DefaultTagHelperActivatorTest.cs +++ b/test/Microsoft.AspNet.Mvc.Razor.Test/DefaultTagHelperActivatorTest.cs @@ -158,7 +158,7 @@ namespace Microsoft.AspNet.Mvc.Razor public object ViewDataValue { get; set; } = new object(); - [Activate] + [ViewContext] public ViewContext ViewContext { get; set; } } @@ -170,7 +170,7 @@ namespace Microsoft.AspNet.Mvc.Razor public object ViewDataValue { get; set; } = new object(); - [Activate] + [ViewContext] public ViewContext ViewContext { get; set; } } } diff --git a/test/Microsoft.AspNet.Mvc.Razor.Test/RazorPageCreateTagHelperTest.cs b/test/Microsoft.AspNet.Mvc.Razor.Test/RazorPageCreateTagHelperTest.cs index e2f8c5c003..a2861cc661 100644 --- a/test/Microsoft.AspNet.Mvc.Razor.Test/RazorPageCreateTagHelperTest.cs +++ b/test/Microsoft.AspNet.Mvc.Razor.Test/RazorPageCreateTagHelperTest.cs @@ -57,56 +57,18 @@ namespace Microsoft.AspNet.Mvc.Razor Assert.NotNull(tagHelper.ViewContext); } - [Fact] - public void CreateTagHelper_ProvidesTagHelperWithViewData() - { - // Arrange - var instance = CreateTestRazorPage(); - - // Act - var tagHelper = instance.CreateTagHelper(); - - // Assert - Assert.NotNull(tagHelper.ViewData); - } - - [Fact] - public void CreateTagHelper_ProvidesTagHelperWithInternalProperties() - { - // Arrange - var instance = CreateTestRazorPage(); - - // Act - var tagHelper = instance.CreateTagHelper(); - - // Assert - Assert.NotNull(tagHelper.ViewData); - Assert.NotNull(tagHelper.ViewContext); - } - - [Fact] - public void CreateTagHelper_ProvidesTagHelperTypeWithViewContextAndActivates() - { - // Arrange - var instance = CreateTestRazorPage(); - - // Act - var tagHelper = instance.CreateTagHelper(); - - // Assert - Assert.NotNull(tagHelper.ViewContext); - Assert.NotNull(tagHelper.ActivatedService); - } - private static TestRazorPage CreateTestRazorPage() { var activator = new RazorPageActivator(new EmptyModelMetadataProvider()); var serviceProvider = new Mock(); + var typeActivator = new DefaultTypeActivatorCache(); var myService = new MyService(); serviceProvider.Setup(mock => mock.GetService(typeof(MyService))) .Returns(myService); serviceProvider.Setup(mock => mock.GetService(typeof(ITagHelperActivator))) .Returns(new DefaultTagHelperActivator()); + serviceProvider.Setup(mock => mock.GetService(typeof(ITypeActivatorCache))) + .Returns(typeActivator); serviceProvider.Setup(mock => mock.GetService(It.Is(serviceType => serviceType.IsGenericType && serviceType.GetGenericTypeDefinition() == typeof(IEnumerable<>)))) .Returns(serviceType => @@ -147,39 +109,21 @@ namespace Microsoft.AspNet.Mvc.Razor private class ServiceTagHelper : TagHelper { - [Activate] + public ServiceTagHelper(MyService service) + { + ActivatedService = service; + } + [HtmlAttributeNotBound] - public MyService ActivatedService { get; set; } + public MyService ActivatedService { get; } } private class ViewContextTagHelper : TagHelper { - [Activate] + [ViewContext] public ViewContext ViewContext { get; set; } } - private class ViewDataTagHelper : TagHelper - { - [Activate] - [HtmlAttributeNotBound] - public ViewDataDictionary ViewData { get; set; } - } - - private class ViewContextServiceTagHelper : ViewContextTagHelper - { - [Activate] - public MyService ActivatedService { get; set; } - } - - private class TagHelperWithInternalProperty : TagHelper - { - [Activate] - protected internal ViewDataDictionary ViewData { get; set; } - - [Activate] - protected internal ViewContext ViewContext { get; set; } - } - private class MyService { } diff --git a/test/Microsoft.AspNet.Mvc.TagHelpers.Test/AnchorTagHelperTest.cs b/test/Microsoft.AspNet.Mvc.TagHelpers.Test/AnchorTagHelperTest.cs index 9275d8e6af..75360f2633 100644 --- a/test/Microsoft.AspNet.Mvc.TagHelpers.Test/AnchorTagHelperTest.cs +++ b/test/Microsoft.AspNet.Mvc.TagHelpers.Test/AnchorTagHelperTest.cs @@ -58,12 +58,11 @@ namespace Microsoft.AspNet.Mvc.TagHelpers var viewContext = TestableHtmlGenerator.GetViewContext(model: null, htmlGenerator: htmlGenerator, metadataProvider: metadataProvider); - var anchorTagHelper = new AnchorTagHelper + var anchorTagHelper = new AnchorTagHelper(htmlGenerator) { Action = "index", Controller = "home", Fragment = "hello=world", - Generator = htmlGenerator, Host = "contoso.com", Protocol = "http", RouteValues = @@ -117,10 +116,9 @@ namespace Microsoft.AspNet.Mvc.TagHelpers null)) .Returns(new TagBuilder("a", new CommonTestEncoder())) .Verifiable(); - var anchorTagHelper = new AnchorTagHelper + var anchorTagHelper = new AnchorTagHelper(generator.Object) { Fragment = "hello=world", - Generator = generator.Object, Host = "contoso.com", Protocol = "http", Route = "Default", @@ -167,12 +165,11 @@ namespace Microsoft.AspNet.Mvc.TagHelpers null)) .Returns(new TagBuilder("a", new CommonTestEncoder())) .Verifiable(); - var anchorTagHelper = new AnchorTagHelper + var anchorTagHelper = new AnchorTagHelper(generator.Object) { Action = "Index", Controller = "Home", Fragment = "hello=world", - Generator = generator.Object, Host = "contoso.com", Protocol = "http", }; @@ -196,7 +193,11 @@ namespace Microsoft.AspNet.Mvc.TagHelpers public async Task ProcessAsync_ThrowsIfHrefConflictsWithBoundAttributes(string propertyName) { // Arrange - var anchorTagHelper = new AnchorTagHelper(); + var metadataProvider = new EmptyModelMetadataProvider(); + var htmlGenerator = new TestableHtmlGenerator(metadataProvider); + + var anchorTagHelper = new AnchorTagHelper(htmlGenerator); + var output = new TagHelperOutput( "a", attributes: new TagHelperAttributeList @@ -230,10 +231,14 @@ namespace Microsoft.AspNet.Mvc.TagHelpers public async Task ProcessAsync_ThrowsIfRouteAndActionOrControllerProvided(string propertyName) { // Arrange - var anchorTagHelper = new AnchorTagHelper + var metadataProvider = new EmptyModelMetadataProvider(); + var htmlGenerator = new TestableHtmlGenerator(metadataProvider); + + var anchorTagHelper = new AnchorTagHelper(htmlGenerator) { Route = "Default", }; + typeof(AnchorTagHelper).GetProperty(propertyName).SetValue(anchorTagHelper, "Home"); var output = new TagHelperOutput( "a", diff --git a/test/Microsoft.AspNet.Mvc.TagHelpers.Test/CacheTagHelperTest.cs b/test/Microsoft.AspNet.Mvc.TagHelpers.Test/CacheTagHelperTest.cs index b8c80eee71..14ba479342 100644 --- a/test/Microsoft.AspNet.Mvc.TagHelpers.Test/CacheTagHelperTest.cs +++ b/test/Microsoft.AspNet.Mvc.TagHelpers.Test/CacheTagHelperTest.cs @@ -31,7 +31,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers // Arrange var id = Guid.NewGuid().ToString(); var tagHelperContext = GetTagHelperContext(id); - var cacheTagHelper = new CacheTagHelper + var cacheTagHelper = new CacheTagHelper(Mock.Of()) { ViewContext = GetViewContext() }; @@ -52,7 +52,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers { // Arrange var tagHelperContext = GetTagHelperContext(); - var cacheTagHelper = new CacheTagHelper + var cacheTagHelper = new CacheTagHelper(Mock.Of()) { ViewContext = GetViewContext(), VaryBy = varyBy @@ -80,7 +80,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers { // Arrange var tagHelperContext = GetTagHelperContext(); - var cacheTagHelper = new CacheTagHelper + var cacheTagHelper = new CacheTagHelper(Mock.Of()) { ViewContext = GetViewContext(), VaryByCookie = varyByCookie @@ -105,7 +105,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers { // Arrange var tagHelperContext = GetTagHelperContext(); - var cacheTagHelper = new CacheTagHelper + var cacheTagHelper = new CacheTagHelper(Mock.Of()) { ViewContext = GetViewContext(), VaryByHeader = varyByHeader @@ -132,7 +132,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers { // Arrange var tagHelperContext = GetTagHelperContext(); - var cacheTagHelper = new CacheTagHelper + var cacheTagHelper = new CacheTagHelper(Mock.Of()) { ViewContext = GetViewContext(), VaryByQuery = varyByQuery @@ -157,7 +157,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers { // Arrange var tagHelperContext = GetTagHelperContext(); - var cacheTagHelper = new CacheTagHelper + var cacheTagHelper = new CacheTagHelper(Mock.Of()) { ViewContext = GetViewContext(), VaryByRoute = varyByRoute @@ -178,7 +178,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers // Arrange var expected = "CacheTagHelper||testid||VaryByUser||"; var tagHelperContext = GetTagHelperContext(); - var cacheTagHelper = new CacheTagHelper + var cacheTagHelper = new CacheTagHelper(Mock.Of()) { ViewContext = GetViewContext(), VaryByUser = true @@ -197,7 +197,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers // Arrange var expected = "CacheTagHelper||testid||VaryByUser||test_name"; var tagHelperContext = GetTagHelperContext(); - var cacheTagHelper = new CacheTagHelper + var cacheTagHelper = new CacheTagHelper(Mock.Of()) { ViewContext = GetViewContext(), VaryByUser = true @@ -219,7 +219,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers var expected = GetHashedBytes("CacheTagHelper||testid||VaryBy||custom-value||" + "VaryByHeader(content-type||text/html)||VaryByUser||someuser"); var tagHelperContext = GetTagHelperContext(); - var cacheTagHelper = new CacheTagHelper + var cacheTagHelper = new CacheTagHelper(Mock.Of()) { ViewContext = GetViewContext(), VaryByUser = true, @@ -257,10 +257,9 @@ namespace Microsoft.AspNet.Mvc.TagHelpers .Returns(false); var tagHelperContext = GetTagHelperContext(id, childContent); var tagHelperOutput = new TagHelperOutput("cache", new TagHelperAttributeList()); - var cacheTagHelper = new CacheTagHelper + var cacheTagHelper = new CacheTagHelper(cache.Object) { ViewContext = GetViewContext(), - MemoryCache = cache.Object, Enabled = false }; @@ -297,10 +296,9 @@ namespace Microsoft.AspNet.Mvc.TagHelpers .Returns(false); var tagHelperContext = GetTagHelperContext(id, childContent); var tagHelperOutput = new TagHelperOutput("cache", new TagHelperAttributeList()); - var cacheTagHelper = new CacheTagHelper + var cacheTagHelper = new CacheTagHelper(cache.Object) { ViewContext = GetViewContext(), - MemoryCache = cache.Object, Enabled = true }; @@ -328,11 +326,10 @@ namespace Microsoft.AspNet.Mvc.TagHelpers var cache = new MemoryCache(new MemoryCacheOptions()); var tagHelperContext1 = GetTagHelperContext(id, childContent); var tagHelperOutput1 = new TagHelperOutput("cache", new TagHelperAttributeList()); - var cacheTagHelper1 = new CacheTagHelper + var cacheTagHelper1 = new CacheTagHelper(cache) { VaryByQuery = "key1,key2", ViewContext = GetViewContext(), - MemoryCache = cache }; cacheTagHelper1.ViewContext.HttpContext.Request.QueryString = new Http.QueryString( "?key1=value1&key2=value2"); @@ -349,11 +346,10 @@ namespace Microsoft.AspNet.Mvc.TagHelpers // Arrange - 2 var tagHelperContext2 = GetTagHelperContext(id, "different-content"); var tagHelperOutput2 = new TagHelperOutput("cache", new TagHelperAttributeList()); - var cacheTagHelper2 = new CacheTagHelper + var cacheTagHelper2 = new CacheTagHelper(cache) { VaryByQuery = "key1,key2", ViewContext = GetViewContext(), - MemoryCache = cache }; cacheTagHelper2.ViewContext.HttpContext.Request.QueryString = new Http.QueryString( "?key1=value1&key2=value2"); @@ -379,11 +375,10 @@ namespace Microsoft.AspNet.Mvc.TagHelpers var tagHelperOutput1 = new TagHelperOutput("cache", new TagHelperAttributeList { { "attr", "value" } }); tagHelperOutput1.PreContent.Append(""); tagHelperOutput1.PostContent.SetContent(""); - var cacheTagHelper1 = new CacheTagHelper + var cacheTagHelper1 = new CacheTagHelper(cache) { VaryByCookie = "cookie1,cookie2", ViewContext = GetViewContext(), - MemoryCache = cache }; cacheTagHelper1.ViewContext.HttpContext.Request.Headers["Cookie"] = "cookie1=value1;cookie2=value2"; @@ -402,11 +397,10 @@ namespace Microsoft.AspNet.Mvc.TagHelpers var tagHelperOutput2 = new TagHelperOutput("cache", new TagHelperAttributeList { { "attr", "value" } }); tagHelperOutput2.PreContent.SetContent(""); tagHelperOutput2.PostContent.SetContent(""); - var cacheTagHelper2 = new CacheTagHelper + var cacheTagHelper2 = new CacheTagHelper(cache) { VaryByCookie = "cookie1,cookie2", ViewContext = GetViewContext(), - MemoryCache = cache }; cacheTagHelper2.ViewContext.HttpContext.Request.Headers["Cookie"] = "cookie1=value1;cookie2=not-value2"; @@ -426,9 +420,8 @@ namespace Microsoft.AspNet.Mvc.TagHelpers // Arrange var expiresOn = DateTimeOffset.UtcNow.AddMinutes(4); var cache = new MemoryCache(new MemoryCacheOptions()); - var cacheTagHelper = new CacheTagHelper + var cacheTagHelper = new CacheTagHelper(cache) { - MemoryCache = cache, ExpiresOn = expiresOn }; @@ -445,9 +438,8 @@ namespace Microsoft.AspNet.Mvc.TagHelpers // Arrange var expiresOn = DateTimeOffset.UtcNow.AddMinutes(7); var cache = new MemoryCache(new MemoryCacheOptions()); - var cacheTagHelper = new CacheTagHelper + var cacheTagHelper = new CacheTagHelper(cache) { - MemoryCache = cache }; var entryLink = new EntryLink(); @@ -467,9 +459,8 @@ namespace Microsoft.AspNet.Mvc.TagHelpers var expiresOn1 = DateTimeOffset.UtcNow.AddDays(12); var expiresOn2 = DateTimeOffset.UtcNow.AddMinutes(4); var cache = new MemoryCache(new MemoryCacheOptions()); - var cacheTagHelper = new CacheTagHelper + var cacheTagHelper = new CacheTagHelper(cache) { - MemoryCache = cache, ExpiresOn = expiresOn1 }; @@ -489,9 +480,8 @@ namespace Microsoft.AspNet.Mvc.TagHelpers // Arrange var expiresAfter = TimeSpan.FromSeconds(42); var cache = new MemoryCache(new MemoryCacheOptions()); - var cacheTagHelper = new CacheTagHelper + var cacheTagHelper = new CacheTagHelper(cache) { - MemoryCache = cache, ExpiresAfter = expiresAfter }; @@ -508,9 +498,8 @@ namespace Microsoft.AspNet.Mvc.TagHelpers // Arrange var expiresSliding = TimeSpan.FromSeconds(37); var cache = new MemoryCache(new MemoryCacheOptions()); - var cacheTagHelper = new CacheTagHelper + var cacheTagHelper = new CacheTagHelper(cache) { - MemoryCache = cache, ExpiresSliding = expiresSliding }; @@ -527,9 +516,8 @@ namespace Microsoft.AspNet.Mvc.TagHelpers // Arrange var priority = CacheItemPriority.High; var cache = new MemoryCache(new MemoryCacheOptions()); - var cacheTagHelper = new CacheTagHelper + var cacheTagHelper = new CacheTagHelper(cache) { - MemoryCache = cache, Priority = priority }; @@ -547,9 +535,8 @@ namespace Microsoft.AspNet.Mvc.TagHelpers var expiresSliding = TimeSpan.FromSeconds(30); var expected = new[] { Mock.Of(), Mock.Of() }; var cache = new MemoryCache(new MemoryCacheOptions()); - var cacheTagHelper = new CacheTagHelper + var cacheTagHelper = new CacheTagHelper(cache) { - MemoryCache = cache, ExpiresSliding = expiresSliding }; @@ -578,10 +565,9 @@ namespace Microsoft.AspNet.Mvc.TagHelpers var tagHelperOutput1 = new TagHelperOutput("cache", new TagHelperAttributeList { { "attr", "value" } }); tagHelperOutput1.PreContent.SetContent(""); tagHelperOutput1.PostContent.SetContent(""); - var cacheTagHelper1 = new CacheTagHelper + var cacheTagHelper1 = new CacheTagHelper(cache) { ViewContext = GetViewContext(), - MemoryCache = cache, ExpiresAfter = TimeSpan.FromMinutes(10) }; @@ -600,10 +586,9 @@ namespace Microsoft.AspNet.Mvc.TagHelpers var tagHelperOutput2 = new TagHelperOutput("cache", new TagHelperAttributeList { { "attr", "value" } }); tagHelperOutput2.PreContent.SetContent(""); tagHelperOutput2.PostContent.SetContent(""); - var cacheTagHelper2 = new CacheTagHelper + var cacheTagHelper2 = new CacheTagHelper(cache) { ViewContext = GetViewContext(), - MemoryCache = cache, ExpiresAfter = TimeSpan.FromMinutes(10) }; currentTime = currentTime.AddMinutes(11); @@ -633,10 +618,9 @@ namespace Microsoft.AspNet.Mvc.TagHelpers var tagHelperOutput1 = new TagHelperOutput("cache", new TagHelperAttributeList { { "attr", "value" } }); tagHelperOutput1.PreContent.SetContent(""); tagHelperOutput1.PostContent.SetContent(""); - var cacheTagHelper1 = new CacheTagHelper + var cacheTagHelper1 = new CacheTagHelper(cache) { ViewContext = GetViewContext(), - MemoryCache = cache, ExpiresOn = currentTime.AddMinutes(5) }; @@ -656,10 +640,9 @@ namespace Microsoft.AspNet.Mvc.TagHelpers var tagHelperOutput2 = new TagHelperOutput("cache", new TagHelperAttributeList { { "attr", "value" } }); tagHelperOutput2.PreContent.SetContent(""); tagHelperOutput2.PostContent.SetContent(""); - var cacheTagHelper2 = new CacheTagHelper + var cacheTagHelper2 = new CacheTagHelper(cache) { ViewContext = GetViewContext(), - MemoryCache = cache, ExpiresOn = currentTime.AddMinutes(5) }; @@ -688,10 +671,9 @@ namespace Microsoft.AspNet.Mvc.TagHelpers var tagHelperOutput1 = new TagHelperOutput("cache", new TagHelperAttributeList { { "attr", "value" } }); tagHelperOutput1.PreContent.SetContent(""); tagHelperOutput1.PostContent.SetContent(""); - var cacheTagHelper1 = new CacheTagHelper + var cacheTagHelper1 = new CacheTagHelper(cache) { ViewContext = GetViewContext(), - MemoryCache = cache, ExpiresSliding = TimeSpan.FromSeconds(30) }; @@ -711,10 +693,9 @@ namespace Microsoft.AspNet.Mvc.TagHelpers var tagHelperOutput2 = new TagHelperOutput("cache", new TagHelperAttributeList { { "attr", "value" } }); tagHelperOutput2.PreContent.SetContent(""); tagHelperOutput2.PostContent.SetContent(""); - var cacheTagHelper2 = new CacheTagHelper + var cacheTagHelper2 = new CacheTagHelper(cache) { ViewContext = GetViewContext(), - MemoryCache = cache, ExpiresSliding = TimeSpan.FromSeconds(30) }; @@ -757,10 +738,9 @@ namespace Microsoft.AspNet.Mvc.TagHelpers var tagHelperOutput = new TagHelperOutput("cache", new TagHelperAttributeList { { "attr", "value" } }); tagHelperOutput.PreContent.SetContent(""); tagHelperOutput.PostContent.SetContent(""); - var cacheTagHelper = new CacheTagHelper + var cacheTagHelper = new CacheTagHelper(cache) { ViewContext = GetViewContext(), - MemoryCache = cache, }; var key = cacheTagHelper.GenerateKey(tagHelperContext); @@ -819,4 +799,4 @@ namespace Microsoft.AspNet.Mvc.TagHelpers } } } -} \ No newline at end of file +} diff --git a/test/Microsoft.AspNet.Mvc.TagHelpers.Test/EnvironmentTagHelperTest.cs b/test/Microsoft.AspNet.Mvc.TagHelpers.Test/EnvironmentTagHelperTest.cs index b47fe7e341..60f175b5ae 100644 --- a/test/Microsoft.AspNet.Mvc.TagHelpers.Test/EnvironmentTagHelperTest.cs +++ b/test/Microsoft.AspNet.Mvc.TagHelpers.Test/EnvironmentTagHelperTest.cs @@ -88,9 +88,8 @@ namespace Microsoft.AspNet.Mvc.TagHelpers.Test hostingEnvironment.Object.EnvironmentName = environmentName; // Act - var helper = new EnvironmentTagHelper + var helper = new EnvironmentTagHelper(hostingEnvironment.Object) { - HostingEnvironment = hostingEnvironment.Object, Names = namesAttribute }; helper.Process(context, output); @@ -116,9 +115,8 @@ namespace Microsoft.AspNet.Mvc.TagHelpers.Test hostingEnvironment.Object.EnvironmentName = environmentName; // Act - var helper = new EnvironmentTagHelper + var helper = new EnvironmentTagHelper(hostingEnvironment.Object) { - HostingEnvironment = hostingEnvironment.Object, Names = namesAttribute }; helper.Process(context, output); diff --git a/test/Microsoft.AspNet.Mvc.TagHelpers.Test/FormTagHelperTest.cs b/test/Microsoft.AspNet.Mvc.TagHelpers.Test/FormTagHelperTest.cs index df4b616179..6d90cf2f0b 100644 --- a/test/Microsoft.AspNet.Mvc.TagHelpers.Test/FormTagHelperTest.cs +++ b/test/Microsoft.AspNet.Mvc.TagHelpers.Test/FormTagHelperTest.cs @@ -60,12 +60,11 @@ namespace Microsoft.AspNet.Mvc.TagHelpers metadataProvider: metadataProvider); var expectedPostContent = "Something" + htmlGenerator.GenerateAntiForgery(viewContext) .ToString(TagRenderMode.SelfClosing); - var formTagHelper = new FormTagHelper + var formTagHelper = new FormTagHelper(htmlGenerator) { Action = "index", AntiForgery = true, Controller = "home", - Generator = htmlGenerator, ViewContext = viewContext, RouteValues = { @@ -127,11 +126,10 @@ namespace Microsoft.AspNet.Mvc.TagHelpers generator.Setup(mock => mock.GenerateAntiForgery(viewContext)) .Returns(new TagBuilder("input", new CommonTestEncoder())); - var formTagHelper = new FormTagHelper + var formTagHelper = new FormTagHelper(generator.Object) { Action = "Index", AntiForgery = antiForgery, - Generator = generator.Object, ViewContext = viewContext, }; @@ -194,11 +192,10 @@ namespace Microsoft.AspNet.Mvc.TagHelpers }) .Returns(new TagBuilder("form", new CommonTestEncoder())) .Verifiable(); - var formTagHelper = new FormTagHelper + var formTagHelper = new FormTagHelper(generator.Object) { Action = "Index", AntiForgery = false, - Generator = generator.Object, ViewContext = testViewContext, RouteValues = { @@ -250,12 +247,11 @@ namespace Microsoft.AspNet.Mvc.TagHelpers null)) .Returns(new TagBuilder("form", new CommonTestEncoder())) .Verifiable(); - var formTagHelper = new FormTagHelper + var formTagHelper = new FormTagHelper(generator.Object) { Action = "Index", AntiForgery = false, Controller = "Home", - Generator = generator.Object, ViewContext = viewContext, }; @@ -301,11 +297,10 @@ namespace Microsoft.AspNet.Mvc.TagHelpers null)) .Returns(new TagBuilder("form", new CommonTestEncoder())) .Verifiable(); - var formTagHelper = new FormTagHelper + var formTagHelper = new FormTagHelper(generator.Object) { AntiForgery = false, Route = "Default", - Generator = generator.Object, ViewContext = viewContext, RouteValues = { @@ -341,10 +336,9 @@ namespace Microsoft.AspNet.Mvc.TagHelpers generator.Setup(mock => mock.GenerateAntiForgery(It.IsAny())) .Returns(new TagBuilder("input", new CommonTestEncoder())); - var formTagHelper = new FormTagHelper + var formTagHelper = new FormTagHelper(generator.Object) { AntiForgery = antiForgery, - Generator = generator.Object, ViewContext = viewContext, }; @@ -386,7 +380,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers public async Task ProcessAsync_ThrowsIfActionConflictsWithBoundAttributes(string propertyName) { // Arrange - var formTagHelper = new FormTagHelper(); + var formTagHelper = new FormTagHelper(new TestableHtmlGenerator(new EmptyModelMetadataProvider())); var tagHelperOutput = new TagHelperOutput( "form", attributes: new TagHelperAttributeList @@ -419,7 +413,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers public async Task ProcessAsync_ThrowsIfRouteAndActionOrControllerProvided(string propertyName) { // Arrange - var formTagHelper = new FormTagHelper + var formTagHelper = new FormTagHelper(new TestableHtmlGenerator(new EmptyModelMetadataProvider())) { Route = "Default", }; diff --git a/test/Microsoft.AspNet.Mvc.TagHelpers.Test/ImageTagHelperTest.cs b/test/Microsoft.AspNet.Mvc.TagHelpers.Test/ImageTagHelperTest.cs index dba73ef93f..1b70f9f05c 100644 --- a/test/Microsoft.AspNet.Mvc.TagHelpers.Test/ImageTagHelperTest.cs +++ b/test/Microsoft.AspNet.Mvc.TagHelpers.Test/ImageTagHelperTest.cs @@ -56,13 +56,12 @@ namespace Microsoft.AspNet.Mvc.TagHelpers var hostingEnvironment = MakeHostingEnvironment(); var viewContext = MakeViewContext(); - var helper = new ImageTagHelper + + var helper = new ImageTagHelper(hostingEnvironment, MakeCache()) { - HostingEnvironment = hostingEnvironment, ViewContext = viewContext, Src = "testimage.png", FileVersion = true, - Cache = MakeCache(), }; // Act @@ -98,13 +97,12 @@ namespace Microsoft.AspNet.Mvc.TagHelpers }); var hostingEnvironment = MakeHostingEnvironment(); var viewContext = MakeViewContext(); - var helper = new ImageTagHelper + + var helper = new ImageTagHelper(hostingEnvironment, MakeCache()) { - HostingEnvironment = hostingEnvironment, ViewContext = viewContext, Src = "/images/test-image.png", FileVersion = true, - Cache = MakeCache(), }; // Act @@ -135,13 +133,12 @@ namespace Microsoft.AspNet.Mvc.TagHelpers }); var hostingEnvironment = MakeHostingEnvironment(); var viewContext = MakeViewContext(); - var helper = new ImageTagHelper + + var helper = new ImageTagHelper(hostingEnvironment, MakeCache()) { - HostingEnvironment = hostingEnvironment, ViewContext = viewContext, Src = "/images/test-image.png", FileVersion = false, - Cache = MakeCache(), }; // Act @@ -172,13 +169,12 @@ namespace Microsoft.AspNet.Mvc.TagHelpers }); var hostingEnvironment = MakeHostingEnvironment(); var viewContext = MakeViewContext("/bar"); - var helper = new ImageTagHelper + + var helper = new ImageTagHelper(hostingEnvironment, MakeCache()) { - HostingEnvironment = hostingEnvironment, ViewContext = viewContext, Src = "/bar/images/image.jpg", FileVersion = true, - Cache = MakeCache(), }; // Act diff --git a/test/Microsoft.AspNet.Mvc.TagHelpers.Test/InputTagHelperTest.cs b/test/Microsoft.AspNet.Mvc.TagHelpers.Test/InputTagHelperTest.cs index b1a37a4687..e2ab61f516 100644 --- a/test/Microsoft.AspNet.Mvc.TagHelpers.Test/InputTagHelperTest.cs +++ b/test/Microsoft.AspNet.Mvc.TagHelpers.Test/InputTagHelperTest.cs @@ -939,10 +939,9 @@ namespace Microsoft.AspNet.Mvc.TagHelpers var modelExpression = new ModelExpression(expressionName, modelExplorer); var viewContext = TestableHtmlGenerator.GetViewContext(container, htmlGenerator, metadataProvider); - var inputTagHelper = new InputTagHelper + var inputTagHelper = new InputTagHelper(htmlGenerator) { For = modelExpression, - Generator = htmlGenerator, ViewContext = viewContext, }; diff --git a/test/Microsoft.AspNet.Mvc.TagHelpers.Test/LabelTagHelperTest.cs b/test/Microsoft.AspNet.Mvc.TagHelpers.Test/LabelTagHelperTest.cs index 7d64bb4209..b5a0d63310 100644 --- a/test/Microsoft.AspNet.Mvc.TagHelpers.Test/LabelTagHelperTest.cs +++ b/test/Microsoft.AspNet.Mvc.TagHelpers.Test/LabelTagHelperTest.cs @@ -177,9 +177,10 @@ namespace Microsoft.AspNet.Mvc.TagHelpers var propertyMetadata = metadataProvider.GetMetadataForProperty(containerType, "Text"); var modelExplorer = containerExplorer.GetExplorerForExpression(propertyMetadata, modelAccessor()); + var htmlGenerator = new TestableHtmlGenerator(metadataProvider); var modelExpression = new ModelExpression(propertyPath, modelExplorer); - var tagHelper = new LabelTagHelper + var tagHelper = new LabelTagHelper(htmlGenerator) { For = modelExpression, }; @@ -211,11 +212,9 @@ namespace Microsoft.AspNet.Mvc.TagHelpers { output.Content.SetContent(tagHelperOutputContent.OriginalContent); } - - var htmlGenerator = new TestableHtmlGenerator(metadataProvider); + var viewContext = TestableHtmlGenerator.GetViewContext(model, htmlGenerator, metadataProvider); tagHelper.ViewContext = viewContext; - tagHelper.Generator = htmlGenerator; // Act await tagHelper.ProcessAsync(tagHelperContext, output); diff --git a/test/Microsoft.AspNet.Mvc.TagHelpers.Test/LinkTagHelperTest.cs b/test/Microsoft.AspNet.Mvc.TagHelpers.Test/LinkTagHelperTest.cs index 29875f2303..529a35ced8 100644 --- a/test/Microsoft.AspNet.Mvc.TagHelpers.Test/LinkTagHelperTest.cs +++ b/test/Microsoft.AspNet.Mvc.TagHelpers.Test/LinkTagHelperTest.cs @@ -109,19 +109,20 @@ namespace Microsoft.AspNet.Mvc.TagHelpers var logger = new Mock>(); var hostingEnvironment = MakeHostingEnvironment(); var viewContext = MakeViewContext(); - var helper = new LinkTagHelper + + var helper = new LinkTagHelper( + logger.Object, + hostingEnvironment, + MakeCache(), + new CommonTestEncoder(), + new CommonTestEncoder()) { - HtmlEncoder = new CommonTestEncoder(), - JavaScriptEncoder = new CommonTestEncoder(), - Logger = logger.Object, - HostingEnvironment = hostingEnvironment, ViewContext = viewContext, FallbackHref = "test.css", FallbackTestClass = "hidden", FallbackTestProperty = "visibility", FallbackTestValue = "hidden", Href = "test.css", - Cache = MakeCache(), }; // Act @@ -280,14 +281,15 @@ namespace Microsoft.AspNet.Mvc.TagHelpers var logger = new Mock>(); var hostingEnvironment = MakeHostingEnvironment(); var viewContext = MakeViewContext(); - var helper = new LinkTagHelper + + var helper = new LinkTagHelper( + logger.Object, + hostingEnvironment, + MakeCache(), + new CommonTestEncoder(), + new CommonTestEncoder()) { - HtmlEncoder = new CommonTestEncoder(), - JavaScriptEncoder = new CommonTestEncoder(), - Logger = logger.Object, - HostingEnvironment = hostingEnvironment, ViewContext = viewContext, - Cache = MakeCache() }; setProperties(helper); @@ -324,19 +326,20 @@ namespace Microsoft.AspNet.Mvc.TagHelpers var logger = new Mock>(); var hostingEnvironment = MakeHostingEnvironment(); var viewContext = MakeViewContext(); - var helper = new LinkTagHelper + + var helper = new LinkTagHelper( + logger.Object, + hostingEnvironment, + MakeCache(), + new CommonTestEncoder(), + new CommonTestEncoder()) { - HtmlEncoder = new CommonTestEncoder(), - JavaScriptEncoder = new CommonTestEncoder(), - Logger = logger.Object, - HostingEnvironment = hostingEnvironment, ViewContext = viewContext, FallbackHref = "test.css", FallbackTestClass = "hidden", FallbackTestProperty = "visibility", FallbackTestValue = "hidden", Href = "test.css", - Cache = MakeCache(), }; // Act @@ -431,12 +434,15 @@ namespace Microsoft.AspNet.Mvc.TagHelpers var logger = new Mock>(); var hostingEnvironment = MakeHostingEnvironment(); var viewContext = MakeViewContext(); - var helper = new LinkTagHelper + + var helper = new LinkTagHelper( + logger.Object, + hostingEnvironment, + MakeCache(), + new CommonTestEncoder(), + new CommonTestEncoder()) { - Logger = logger.Object, - HostingEnvironment = hostingEnvironment, ViewContext = viewContext, - Cache = MakeCache(), }; setProperties(helper); @@ -457,12 +463,15 @@ namespace Microsoft.AspNet.Mvc.TagHelpers var logger = new Mock>(); var hostingEnvironment = MakeHostingEnvironment(); var viewContext = MakeViewContext(); - var helper = new LinkTagHelper + + var helper = new LinkTagHelper( + logger.Object, + hostingEnvironment, + MakeCache(), + new CommonTestEncoder(), + new CommonTestEncoder()) { - Logger = logger.Object, - HostingEnvironment = hostingEnvironment, ViewContext = viewContext, - Cache = MakeCache(), }; // Act @@ -494,16 +503,18 @@ namespace Microsoft.AspNet.Mvc.TagHelpers var globbingUrlBuilder = new Mock(); globbingUrlBuilder.Setup(g => g.BuildUrlList("/css/site.css", "**/*.css", null)) .Returns(new[] { "/css/site.css", "/base.css" }); - var helper = new LinkTagHelper + + var helper = new LinkTagHelper( + logger.Object, + hostingEnvironment, + MakeCache(), + new CommonTestEncoder(), + new CommonTestEncoder()) { - HtmlEncoder = new CommonTestEncoder(), GlobbingUrlBuilder = globbingUrlBuilder.Object, - Logger = logger.Object, - HostingEnvironment = hostingEnvironment, ViewContext = viewContext, Href = "/css/site.css", HrefInclude = "**/*.css", - Cache = MakeCache(), }; // Act @@ -537,16 +548,18 @@ namespace Microsoft.AspNet.Mvc.TagHelpers var globbingUrlBuilder = new Mock(); globbingUrlBuilder.Setup(g => g.BuildUrlList("/css/site.css", "**/*.css", null)) .Returns(new[] { "/css/site.css", "/base.css" }); - var helper = new LinkTagHelper + + var helper = new LinkTagHelper( + logger.Object, + hostingEnvironment, + MakeCache(), + new CommonTestEncoder(), + new CommonTestEncoder()) { - HtmlEncoder = new CommonTestEncoder(), GlobbingUrlBuilder = globbingUrlBuilder.Object, - Logger = logger.Object, - HostingEnvironment = hostingEnvironment, ViewContext = viewContext, Href = "/css/site.css", HrefInclude = "**/*.css", - Cache = MakeCache(), }; // Act @@ -577,16 +590,18 @@ namespace Microsoft.AspNet.Mvc.TagHelpers var logger = new Mock>(); var hostingEnvironment = MakeHostingEnvironment(); var viewContext = MakeViewContext(); - var helper = new LinkTagHelper + + var helper = new LinkTagHelper( + logger.Object, + hostingEnvironment, + MakeCache(), + new CommonTestEncoder(), + new CommonTestEncoder()) { - HtmlEncoder = new CommonTestEncoder(), - Logger = logger.Object, - HostingEnvironment = hostingEnvironment, ViewContext = viewContext, Href = "/css/site.css", HrefInclude = "**/*.css", FileVersion = true, - Cache = MakeCache(), }; // Act @@ -616,16 +631,18 @@ namespace Microsoft.AspNet.Mvc.TagHelpers var logger = new Mock>(); var hostingEnvironment = MakeHostingEnvironment(); var viewContext = MakeViewContext("/bar"); - var helper = new LinkTagHelper + + var helper = new LinkTagHelper( + logger.Object, + hostingEnvironment, + MakeCache(), + new CommonTestEncoder(), + new CommonTestEncoder()) { - HtmlEncoder = new CommonTestEncoder(), - Logger = logger.Object, - HostingEnvironment = hostingEnvironment, ViewContext = viewContext, Href = "/bar/css/site.css", HrefInclude = "**/*.css", FileVersion = true, - Cache = MakeCache(), }; // Act @@ -659,17 +676,19 @@ namespace Microsoft.AspNet.Mvc.TagHelpers var globbingUrlBuilder = new Mock(); globbingUrlBuilder.Setup(g => g.BuildUrlList("/css/site.css", "**/*.css", null)) .Returns(new[] { "/css/site.css", "/base.css" }); - var helper = new LinkTagHelper + + var helper = new LinkTagHelper( + logger.Object, + hostingEnvironment, + MakeCache(), + new CommonTestEncoder(), + new CommonTestEncoder()) { - HtmlEncoder = new CommonTestEncoder(), GlobbingUrlBuilder = globbingUrlBuilder.Object, - Logger = logger.Object, - HostingEnvironment = hostingEnvironment, ViewContext = viewContext, Href = "/css/site.css", HrefInclude = "**/*.css", FileVersion = true, - Cache = MakeCache(), }; // Act diff --git a/test/Microsoft.AspNet.Mvc.TagHelpers.Test/OptionTagHelperTest.cs b/test/Microsoft.AspNet.Mvc.TagHelpers.Test/OptionTagHelperTest.cs index 64ceb0068b..6e8d81ed41 100644 --- a/test/Microsoft.AspNet.Mvc.TagHelpers.Test/OptionTagHelperTest.cs +++ b/test/Microsoft.AspNet.Mvc.TagHelpers.Test/OptionTagHelperTest.cs @@ -419,9 +419,8 @@ namespace Microsoft.AspNet.Mvc.TagHelpers htmlGenerator: htmlGenerator, metadataProvider: metadataProvider); viewContext.FormContext.FormData[SelectTagHelper.SelectedValuesFormDataKey] = selectedValues; - var tagHelper = new OptionTagHelper + var tagHelper = new OptionTagHelper(htmlGenerator) { - Generator = htmlGenerator, Value = value, ViewContext = viewContext, }; @@ -489,7 +488,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers htmlGenerator: htmlGenerator, metadataProvider: metadataProvider); viewContext.FormContext.FormData[SelectTagHelper.SelectedValuesFormDataKey] = selectedValues; - var tagHelper = new OptionTagHelper + var tagHelper = new OptionTagHelper(htmlGenerator) { Value = value, ViewContext = viewContext, @@ -535,6 +534,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers tagHelperContent.SetContent(originalContent); return Task.FromResult(tagHelperContent); }); + var output = new TagHelperOutput(originalTagName, originalAttributes) { SelfClosing = false, @@ -543,7 +543,10 @@ namespace Microsoft.AspNet.Mvc.TagHelpers output.Content.SetContent(originalContent); output.PostContent.SetContent(originalPostContent); - var tagHelper = new OptionTagHelper + var metadataProvider = new EmptyModelMetadataProvider(); + var htmlGenerator = new TestableHtmlGenerator(metadataProvider); + + var tagHelper = new OptionTagHelper(htmlGenerator) { Value = value, }; @@ -562,4 +565,4 @@ namespace Microsoft.AspNet.Mvc.TagHelpers return tagHelperOutput; } } -} +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.Mvc.TagHelpers.Test/ScriptTagHelperTest.cs b/test/Microsoft.AspNet.Mvc.TagHelpers.Test/ScriptTagHelperTest.cs index 4803670fae..9b512787dc 100644 --- a/test/Microsoft.AspNet.Mvc.TagHelpers.Test/ScriptTagHelperTest.cs +++ b/test/Microsoft.AspNet.Mvc.TagHelpers.Test/ScriptTagHelperTest.cs @@ -55,17 +55,17 @@ namespace Microsoft.AspNet.Mvc.TagHelpers var output = MakeTagHelperOutput("script", combinedOutputAttributes); var hostingEnvironment = MakeHostingEnvironment(); - var helper = new ScriptTagHelper + var helper = new ScriptTagHelper( + CreateLogger(), + hostingEnvironment, + MakeCache(), + new CommonTestEncoder(), + new CommonTestEncoder()) { - HtmlEncoder = new CommonTestEncoder(), - JavaScriptEncoder = new CommonTestEncoder(), ViewContext = viewContext, - HostingEnvironment = hostingEnvironment, FallbackSrc = "~/blank.js", FallbackTestExpression = "http://www.example.com/blank.js", Src = "/blank.js", - Cache = MakeCache(), - Logger = CreateLogger() }; // Act @@ -271,14 +271,15 @@ namespace Microsoft.AspNet.Mvc.TagHelpers var logger = CreateLogger(); var hostingEnvironment = MakeHostingEnvironment(); var viewContext = MakeViewContext(); - var helper = new ScriptTagHelper + + var helper = new ScriptTagHelper( + CreateLogger(), + hostingEnvironment, + MakeCache(), + new CommonTestEncoder(), + new CommonTestEncoder()) { - HtmlEncoder = new CommonTestEncoder(), - JavaScriptEncoder = new CommonTestEncoder(), - Logger = logger, - HostingEnvironment = hostingEnvironment, ViewContext = viewContext, - Cache = MakeCache(), }; setProperties(helper); @@ -363,12 +364,15 @@ namespace Microsoft.AspNet.Mvc.TagHelpers var logger = new Mock>(); var hostingEnvironment = MakeHostingEnvironment(); var viewContext = MakeViewContext(); - var helper = new ScriptTagHelper + + var helper = new ScriptTagHelper( + CreateLogger(), + hostingEnvironment, + MakeCache(), + new CommonTestEncoder(), + new CommonTestEncoder()) { - Logger = logger.Object, - HostingEnvironment = hostingEnvironment, ViewContext = viewContext, - Cache = MakeCache(), }; setProperties(helper); @@ -392,12 +396,15 @@ namespace Microsoft.AspNet.Mvc.TagHelpers var logger = CreateLogger(); var hostingEnvironment = MakeHostingEnvironment(); var viewContext = MakeViewContext(); - var helper = new ScriptTagHelper + + var helper = new ScriptTagHelper( + logger, + hostingEnvironment, + MakeCache(), + new CommonTestEncoder(), + new CommonTestEncoder()) { - Logger = logger, - HostingEnvironment = hostingEnvironment, ViewContext = viewContext, - Cache = MakeCache(), }; setProperties(helper); @@ -431,11 +438,14 @@ namespace Microsoft.AspNet.Mvc.TagHelpers var output = MakeTagHelperOutput("script"); var logger = CreateLogger(); - var helper = new ScriptTagHelper + var helper = new ScriptTagHelper( + CreateLogger(), + MakeHostingEnvironment(), + MakeCache(), + new CommonTestEncoder(), + new CommonTestEncoder()) { - Logger = logger, ViewContext = viewContext, - Cache = MakeCache(), }; // Act @@ -455,11 +465,14 @@ namespace Microsoft.AspNet.Mvc.TagHelpers var output = MakeTagHelperOutput("script"); var logger = CreateLogger(); - var helper = new ScriptTagHelper + var helper = new ScriptTagHelper( + logger, + MakeHostingEnvironment(), + MakeCache(), + new CommonTestEncoder(), + new CommonTestEncoder()) { - Logger = logger, ViewContext = viewContext, - Cache = MakeCache(), }; // Act @@ -503,17 +516,17 @@ namespace Microsoft.AspNet.Mvc.TagHelpers var logger = CreateLogger(); var hostingEnvironment = MakeHostingEnvironment(); - var helper = new ScriptTagHelper + var helper = new ScriptTagHelper( + logger, + hostingEnvironment, + MakeCache(), + new CommonTestEncoder(), + new CommonTestEncoder()) { - HtmlEncoder = new CommonTestEncoder(), - JavaScriptEncoder = new CommonTestEncoder(), - Logger = logger, ViewContext = viewContext, - HostingEnvironment = hostingEnvironment, FallbackSrc = "~/blank.js", FallbackTestExpression = "http://www.example.com/blank.js", Src = "/blank.js", - Cache = MakeCache(), }; // Act @@ -543,16 +556,18 @@ namespace Microsoft.AspNet.Mvc.TagHelpers var globbingUrlBuilder = new Mock(); globbingUrlBuilder.Setup(g => g.BuildUrlList("/js/site.js", "**/*.js", null)) .Returns(new[] { "/js/site.js", "/common.js" }); - var helper = new ScriptTagHelper + + var helper = new ScriptTagHelper( + logger.Object, + hostingEnvironment, + MakeCache(), + new CommonTestEncoder(), + new CommonTestEncoder()) { GlobbingUrlBuilder = globbingUrlBuilder.Object, - Logger = logger.Object, - HostingEnvironment = hostingEnvironment, ViewContext = viewContext, Src = "/js/site.js", SrcInclude = "**/*.js", - HtmlEncoder = new CommonTestEncoder(), - Cache = MakeCache(), }; // Act @@ -580,17 +595,18 @@ namespace Microsoft.AspNet.Mvc.TagHelpers var globbingUrlBuilder = new Mock(); globbingUrlBuilder.Setup(g => g.BuildUrlList("/js/site.js", "**/*.js", null)) .Returns(new[] { "/js/site.js", "/common.js" }); - var helper = new ScriptTagHelper + + var helper = new ScriptTagHelper( + logger.Object, + hostingEnvironment, + MakeCache(), + new CommonTestEncoder(), + new CommonTestEncoder()) { GlobbingUrlBuilder = globbingUrlBuilder.Object, - Logger = logger.Object, - HostingEnvironment = hostingEnvironment, ViewContext = viewContext, Src = "/js/site.js", SrcInclude = "**/*.js", - HtmlEncoder = new CommonTestEncoder(), - JavaScriptEncoder = new TestJavaScriptEncoder(), - Cache = MakeCache(), }; // Act @@ -617,16 +633,16 @@ namespace Microsoft.AspNet.Mvc.TagHelpers var hostingEnvironment = MakeHostingEnvironment(); var viewContext = MakeViewContext(); - var helper = new ScriptTagHelper + var helper = new ScriptTagHelper( + logger.Object, + MakeHostingEnvironment(), + MakeCache(), + new CommonTestEncoder(), + new CommonTestEncoder()) { - Logger = logger.Object, - HostingEnvironment = hostingEnvironment, ViewContext = viewContext, FileVersion = true, - HtmlEncoder = new CommonTestEncoder(), - JavaScriptEncoder = new TestJavaScriptEncoder(), Src = "/js/site.js", - Cache = MakeCache(), }; // Act @@ -654,16 +670,16 @@ namespace Microsoft.AspNet.Mvc.TagHelpers var hostingEnvironment = MakeHostingEnvironment(); var viewContext = MakeViewContext("/bar"); - var helper = new ScriptTagHelper + var helper = new ScriptTagHelper( + logger.Object, + MakeHostingEnvironment(), + MakeCache(), + new CommonTestEncoder(), + new CommonTestEncoder()) { - Logger = logger.Object, - HostingEnvironment = hostingEnvironment, ViewContext = viewContext, FileVersion = true, - HtmlEncoder = new CommonTestEncoder(), - JavaScriptEncoder = new TestJavaScriptEncoder(), Src = "/bar/js/site.js", - Cache = MakeCache(), }; // Act @@ -693,18 +709,18 @@ namespace Microsoft.AspNet.Mvc.TagHelpers var hostingEnvironment = MakeHostingEnvironment(); var viewContext = MakeViewContext(); - var helper = new ScriptTagHelper + var helper = new ScriptTagHelper( + logger.Object, + MakeHostingEnvironment(), + MakeCache(), + new CommonTestEncoder(), + new CommonTestEncoder()) { - Logger = logger.Object, - HostingEnvironment = hostingEnvironment, ViewContext = viewContext, FallbackSrc = "fallback.js", FallbackTestExpression = "isavailable()", FileVersion = true, - HtmlEncoder = new CommonTestEncoder(), - JavaScriptEncoder = new TestJavaScriptEncoder(), Src = "/js/site.js", - Cache = MakeCache(), }; // Act @@ -713,7 +729,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers // Assert Assert.Equal( "\r\n\r\n", output.Content.GetContent()); } @@ -736,18 +752,19 @@ namespace Microsoft.AspNet.Mvc.TagHelpers var globbingUrlBuilder = new Mock(); globbingUrlBuilder.Setup(g => g.BuildUrlList("/js/site.js", "*.js", null)) .Returns(new[] { "/js/site.js", "/common.js" }); - var helper = new ScriptTagHelper + + var helper = new ScriptTagHelper( + logger.Object, + MakeHostingEnvironment(), + MakeCache(), + new CommonTestEncoder(), + new CommonTestEncoder()) { GlobbingUrlBuilder = globbingUrlBuilder.Object, - Logger = logger.Object, - HostingEnvironment = hostingEnvironment, ViewContext = viewContext, SrcInclude = "*.js", FileVersion = true, - HtmlEncoder = new CommonTestEncoder(), - JavaScriptEncoder = new TestJavaScriptEncoder(), Src = "/js/site.js", - Cache = MakeCache(), }; // Act diff --git a/test/Microsoft.AspNet.Mvc.TagHelpers.Test/SelectTagHelperTest.cs b/test/Microsoft.AspNet.Mvc.TagHelpers.Test/SelectTagHelperTest.cs index f299d9b3c8..1ac161a1b6 100644 --- a/test/Microsoft.AspNet.Mvc.TagHelpers.Test/SelectTagHelperTest.cs +++ b/test/Microsoft.AspNet.Mvc.TagHelpers.Test/SelectTagHelperTest.cs @@ -224,10 +224,9 @@ namespace Microsoft.AspNet.Mvc.TagHelpers } }; var viewContext = TestableHtmlGenerator.GetViewContext(model, htmlGenerator, metadataProvider); - var tagHelper = new SelectTagHelper + var tagHelper = new SelectTagHelper(htmlGenerator) { For = modelExpression, - Generator = htmlGenerator, ViewContext = viewContext, }; @@ -319,10 +318,10 @@ namespace Microsoft.AspNet.Mvc.TagHelpers var savedSelected = items.Select(item => item.Selected).ToList(); var savedText = items.Select(item => item.Text).ToList(); var savedValue = items.Select(item => item.Value).ToList(); - var tagHelper = new SelectTagHelper + + var tagHelper = new SelectTagHelper(htmlGenerator) { For = modelExpression, - Generator = htmlGenerator, Items = items, ViewContext = viewContext, }; @@ -422,10 +421,10 @@ namespace Microsoft.AspNet.Mvc.TagHelpers var savedSelected = items.Select(item => item.Selected).ToList(); var savedText = items.Select(item => item.Text).ToList(); var savedValue = items.Select(item => item.Value).ToList(); - var tagHelper = new SelectTagHelper + + var tagHelper = new SelectTagHelper(htmlGenerator) { For = modelExpression, - Generator = htmlGenerator, Items = items, ViewContext = viewContext, }; @@ -519,11 +518,10 @@ namespace Microsoft.AspNet.Mvc.TagHelpers .Returns((TagBuilder)null) .Verifiable(); - var tagHelper = new SelectTagHelper + var tagHelper = new SelectTagHelper(htmlGenerator.Object) { For = modelExpression, Items = inputItems, - Generator = htmlGenerator.Object, ViewContext = viewContext, }; @@ -593,10 +591,9 @@ namespace Microsoft.AspNet.Mvc.TagHelpers .Returns((TagBuilder)null) .Verifiable(); - var tagHelper = new SelectTagHelper + var tagHelper = new SelectTagHelper(htmlGenerator.Object) { For = modelExpression, - Generator = htmlGenerator.Object, ViewContext = viewContext, }; diff --git a/test/Microsoft.AspNet.Mvc.TagHelpers.Test/TextAreaTagHelperTest.cs b/test/Microsoft.AspNet.Mvc.TagHelpers.Test/TextAreaTagHelperTest.cs index 4e3da61406..4d5009768e 100644 --- a/test/Microsoft.AspNet.Mvc.TagHelpers.Test/TextAreaTagHelperTest.cs +++ b/test/Microsoft.AspNet.Mvc.TagHelpers.Test/TextAreaTagHelperTest.cs @@ -106,9 +106,17 @@ namespace Microsoft.AspNet.Mvc.TagHelpers var propertyMetadata = metadataProvider.GetMetadataForProperty(containerType, "Text"); var modelExplorer = containerExplorer.GetExplorerForExpression(propertyMetadata, model); + var htmlGenerator = new TestableHtmlGenerator(metadataProvider) + { + ValidationAttributes = + { + { "valid", "from validation attributes" }, + } + }; + // Property name is either nameof(Model.Text) or nameof(NestedModel.Text). var modelExpression = new ModelExpression(nameAndId.Name, modelExplorer); - var tagHelper = new TextAreaTagHelper + var tagHelper = new TextAreaTagHelper(htmlGenerator) { For = modelExpression, }; @@ -134,16 +142,8 @@ namespace Microsoft.AspNet.Mvc.TagHelpers }; output.Content.SetContent("original content"); - var htmlGenerator = new TestableHtmlGenerator(metadataProvider) - { - ValidationAttributes = - { - { "valid", "from validation attributes" }, - } - }; var viewContext = TestableHtmlGenerator.GetViewContext(model, htmlGenerator, metadataProvider); tagHelper.ViewContext = viewContext; - tagHelper.Generator = htmlGenerator; // Act await tagHelper.ProcessAsync(tagHelperContext, output); diff --git a/test/Microsoft.AspNet.Mvc.TagHelpers.Test/ValidationMessageTagHelperTest.cs b/test/Microsoft.AspNet.Mvc.TagHelpers.Test/ValidationMessageTagHelperTest.cs index bf443495c4..516972fd40 100644 --- a/test/Microsoft.AspNet.Mvc.TagHelpers.Test/ValidationMessageTagHelperTest.cs +++ b/test/Microsoft.AspNet.Mvc.TagHelpers.Test/ValidationMessageTagHelperTest.cs @@ -25,7 +25,9 @@ namespace Microsoft.AspNet.Mvc.TagHelpers var expectedTagName = "not-span"; var metadataProvider = new TestModelMetadataProvider(); var modelExpression = CreateModelExpression("Name"); - var validationMessageTagHelper = new ValidationMessageTagHelper + var htmlGenerator = new TestableHtmlGenerator(metadataProvider); + + var validationMessageTagHelper = new ValidationMessageTagHelper(htmlGenerator) { For = modelExpression }; @@ -57,12 +59,11 @@ namespace Microsoft.AspNet.Mvc.TagHelpers output.PreContent.SetContent(expectedPreContent); output.Content.SetContent(expectedContent); output.PostContent.SetContent(expectedPostContent); - var htmlGenerator = new TestableHtmlGenerator(metadataProvider); + var viewContext = TestableHtmlGenerator.GetViewContext(model: null, htmlGenerator: htmlGenerator, metadataProvider: metadataProvider); validationMessageTagHelper.ViewContext = viewContext; - validationMessageTagHelper.Generator = htmlGenerator; // Act await validationMessageTagHelper.ProcessAsync(tagHelperContext, output); @@ -87,7 +88,15 @@ namespace Microsoft.AspNet.Mvc.TagHelpers public async Task ProcessAsync_CallsIntoGenerateValidationMessageWithExpectedParameters() { // Arrange - var validationMessageTagHelper = new ValidationMessageTagHelper + var expectedViewContext = CreateViewContext(); + var generator = new Mock(); + generator + .Setup(mock => + mock.GenerateValidationMessage(expectedViewContext, "Hello", null, null, null)) + .Returns(new TagBuilder("span", new CommonTestEncoder())) + .Verifiable(); + + var validationMessageTagHelper = new ValidationMessageTagHelper(generator.Object) { For = CreateModelExpression("Hello") }; @@ -112,14 +121,6 @@ namespace Microsoft.AspNet.Mvc.TagHelpers output.Content.SetContent(expectedContent); output.PostContent.SetContent(expectedPostContent); - var expectedViewContext = CreateViewContext(); - var generator = new Mock(); - generator - .Setup(mock => - mock.GenerateValidationMessage(expectedViewContext, "Hello", null, null, null)) - .Returns(new TagBuilder("span", new CommonTestEncoder())) - .Verifiable(); - validationMessageTagHelper.Generator = generator.Object; validationMessageTagHelper.ViewContext = expectedViewContext; // Act & Assert @@ -141,7 +142,24 @@ namespace Microsoft.AspNet.Mvc.TagHelpers string childContent, string outputContent, string expectedOutputContent) { // Arrange - var validationMessageTagHelper = new ValidationMessageTagHelper + var tagBuilder = new TagBuilder("span2", new CommonTestEncoder()) + { + InnerHtml = "New HTML" + }; + tagBuilder.Attributes.Add("data-foo", "bar"); + tagBuilder.Attributes.Add("data-hello", "world"); + + var generator = new Mock(MockBehavior.Strict); + var setup = generator + .Setup(mock => mock.GenerateValidationMessage( + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny())) + .Returns(tagBuilder); + + var validationMessageTagHelper = new ValidationMessageTagHelper(generator.Object) { For = CreateModelExpression("Hello") }; @@ -161,25 +179,9 @@ namespace Microsoft.AspNet.Mvc.TagHelpers tagHelperContent.SetContent(childContent); return Task.FromResult(tagHelperContent); }); - var tagBuilder = new TagBuilder("span2", new CommonTestEncoder()) - { - InnerHtml = "New HTML" - }; - tagBuilder.Attributes.Add("data-foo", "bar"); - tagBuilder.Attributes.Add("data-hello", "world"); - var generator = new Mock(MockBehavior.Strict); - var setup = generator - .Setup(mock => mock.GenerateValidationMessage( - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny())) - .Returns(tagBuilder); var viewContext = CreateViewContext(); validationMessageTagHelper.ViewContext = viewContext; - validationMessageTagHelper.Generator = generator.Object; // Act await validationMessageTagHelper.ProcessAsync(context, output: output); @@ -201,7 +203,24 @@ namespace Microsoft.AspNet.Mvc.TagHelpers string childContent, string expectedOutputContent) { // Arrange - var validationMessageTagHelper = new ValidationMessageTagHelper + var tagBuilder = new TagBuilder("span2", new CommonTestEncoder()) + { + InnerHtml = "New HTML" + }; + tagBuilder.Attributes.Add("data-foo", "bar"); + tagBuilder.Attributes.Add("data-hello", "world"); + + var generator = new Mock(MockBehavior.Strict); + var setup = generator + .Setup(mock => mock.GenerateValidationMessage( + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny())) + .Returns(tagBuilder); + + var validationMessageTagHelper = new ValidationMessageTagHelper(generator.Object) { For = CreateModelExpression("Hello") }; @@ -220,25 +239,9 @@ namespace Microsoft.AspNet.Mvc.TagHelpers tagHelperContent.SetContent(childContent); return Task.FromResult(tagHelperContent); }); - var tagBuilder = new TagBuilder("span2", new CommonTestEncoder()) - { - InnerHtml = "New HTML" - }; - tagBuilder.Attributes.Add("data-foo", "bar"); - tagBuilder.Attributes.Add("data-hello", "world"); - var generator = new Mock(MockBehavior.Strict); - var setup = generator - .Setup(mock => mock.GenerateValidationMessage( - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny())) - .Returns(tagBuilder); var viewContext = CreateViewContext(); validationMessageTagHelper.ViewContext = viewContext; - validationMessageTagHelper.Generator = generator.Object; // Act await validationMessageTagHelper.ProcessAsync(context, output: output); @@ -257,7 +260,8 @@ namespace Microsoft.AspNet.Mvc.TagHelpers public async Task ProcessAsync_DoesNothingIfNullFor() { // Arrange - var validationMessageTagHelper = new ValidationMessageTagHelper(); + var generator = new Mock(MockBehavior.Strict); + var validationMessageTagHelper = new ValidationMessageTagHelper(generator.Object); var expectedPreContent = "original pre-content"; var expectedContent = "original content"; var expectedPostContent = "original post-content"; @@ -269,9 +273,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers output.PostContent.SetContent(expectedPostContent); var viewContext = CreateViewContext(); - var generator = new Mock(MockBehavior.Strict); validationMessageTagHelper.ViewContext = viewContext; - validationMessageTagHelper.Generator = generator.Object; // Act await validationMessageTagHelper.ProcessAsync(context: null, output: output); diff --git a/test/Microsoft.AspNet.Mvc.TagHelpers.Test/ValidationSummaryTagHelperTest.cs b/test/Microsoft.AspNet.Mvc.TagHelpers.Test/ValidationSummaryTagHelperTest.cs index 1b34c79b7c..52d0cf3003 100644 --- a/test/Microsoft.AspNet.Mvc.TagHelpers.Test/ValidationSummaryTagHelperTest.cs +++ b/test/Microsoft.AspNet.Mvc.TagHelpers.Test/ValidationSummaryTagHelperTest.cs @@ -20,24 +20,15 @@ namespace Microsoft.AspNet.Mvc.TagHelpers { public class ValidationSummaryTagHelperTest { - public void Concstructor_IntializesProperties_AsExpected() - { - // Arrange & Act - var validationSummaryTagHelper = new ValidationSummaryTagHelper(); - - // Assert - Assert.Null(validationSummaryTagHelper.Generator); - Assert.Null(validationSummaryTagHelper.ViewContext); - Assert.Equal(ValidationSummary.None, validationSummaryTagHelper.ValidationSummary); - } - [Fact] public async Task ProcessAsync_GeneratesExpectedOutput() { // Arrange var expectedTagName = "not-div"; var metadataProvider = new TestModelMetadataProvider(); - var validationSummaryTagHelper = new ValidationSummaryTagHelper + var htmlGenerator = new TestableHtmlGenerator(metadataProvider); + + var validationSummaryTagHelper = new ValidationSummaryTagHelper(htmlGenerator) { ValidationSummary = ValidationSummary.All, }; @@ -65,11 +56,9 @@ namespace Microsoft.AspNet.Mvc.TagHelpers output.Content.SetContent(expectedContent); output.PostContent.SetContent("Custom Content"); - var htmlGenerator = new TestableHtmlGenerator(metadataProvider); Model model = null; var viewContext = TestableHtmlGenerator.GetViewContext(model, htmlGenerator, metadataProvider); validationSummaryTagHelper.ViewContext = viewContext; - validationSummaryTagHelper.Generator = htmlGenerator; // Act await validationSummaryTagHelper.ProcessAsync(tagHelperContext, output); @@ -95,21 +84,8 @@ namespace Microsoft.AspNet.Mvc.TagHelpers bool expectedExcludePropertyErrors) { // Arrange - var validationSummaryTagHelper = new ValidationSummaryTagHelper - { - ValidationSummary = validationSummary, - }; - var expectedPreContent = "original pre-content"; - var expectedContent = "original content"; - var expectedPostContent = "original post-content"; - var output = new TagHelperOutput( - "div", - attributes: new TagHelperAttributeList()); - output.PreContent.SetContent(expectedPreContent); - output.Content.SetContent(expectedContent); - output.PostContent.SetContent(expectedPostContent); - var expectedViewContext = CreateViewContext(); + var generator = new Mock(); generator .Setup(mock => mock.GenerateValidationSummary( @@ -120,8 +96,24 @@ namespace Microsoft.AspNet.Mvc.TagHelpers null)) // htmlAttributes .Returns(new TagBuilder("div", new HtmlEncoder())) .Verifiable(); + + var validationSummaryTagHelper = new ValidationSummaryTagHelper(generator.Object) + { + ValidationSummary = validationSummary, + }; + + var expectedPreContent = "original pre-content"; + var expectedContent = "original content"; + var expectedPostContent = "original post-content"; + var output = new TagHelperOutput( + "div", + attributes: new TagHelperAttributeList()); + output.PreContent.SetContent(expectedPreContent); + output.Content.SetContent(expectedContent); + output.PostContent.SetContent(expectedPostContent); + + validationSummaryTagHelper.ViewContext = expectedViewContext; - validationSummaryTagHelper.Generator = generator.Object; // Act & Assert await validationSummaryTagHelper.ProcessAsync(context: null, output: output); @@ -138,19 +130,6 @@ namespace Microsoft.AspNet.Mvc.TagHelpers public async Task ProcessAsync_MergesTagBuilderFromGenerateValidationSummary() { // Arrange - var validationSummaryTagHelper = new ValidationSummaryTagHelper - { - ValidationSummary = ValidationSummary.ModelOnly, - }; - var expectedPreContent = "original pre-content"; - var expectedContent = "original content"; - var output = new TagHelperOutput( - "div", - attributes: new TagHelperAttributeList()); - output.PreContent.SetContent(expectedPreContent); - output.Content.SetContent(expectedContent); - output.PostContent.SetContent("Content of validation summary"); - var tagBuilder = new TagBuilder("span2", new HtmlEncoder()) { InnerHtml = "New HTML" @@ -169,9 +148,23 @@ namespace Microsoft.AspNet.Mvc.TagHelpers It.IsAny(), It.IsAny())) .Returns(tagBuilder); + + var validationSummaryTagHelper = new ValidationSummaryTagHelper(generator.Object) + { + ValidationSummary = ValidationSummary.ModelOnly, + }; + + var expectedPreContent = "original pre-content"; + var expectedContent = "original content"; + var output = new TagHelperOutput( + "div", + attributes: new TagHelperAttributeList()); + output.PreContent.SetContent(expectedPreContent); + output.Content.SetContent(expectedContent); + output.PostContent.SetContent("Content of validation summary"); + var viewContext = CreateViewContext(); validationSummaryTagHelper.ViewContext = viewContext; - validationSummaryTagHelper.Generator = generator.Object; // Act await validationSummaryTagHelper.ProcessAsync(context: null, output: output); @@ -194,10 +187,13 @@ namespace Microsoft.AspNet.Mvc.TagHelpers public async Task ProcessAsync_DoesNothingIfValidationSummaryNone() { // Arrange - var validationSummaryTagHelper = new ValidationSummaryTagHelper + var generator = new Mock(MockBehavior.Strict); + + var validationSummaryTagHelper = new ValidationSummaryTagHelper(generator.Object) { ValidationSummary = ValidationSummary.None, }; + var expectedPreContent = "original pre-content"; var expectedContent = "original content"; var expectedPostContent = "original post-content"; @@ -208,10 +204,8 @@ namespace Microsoft.AspNet.Mvc.TagHelpers output.Content.SetContent(expectedContent); output.PostContent.SetContent(expectedPostContent); - var generator = new Mock(MockBehavior.Strict); var viewContext = CreateViewContext(); validationSummaryTagHelper.ViewContext = viewContext; - validationSummaryTagHelper.Generator = generator.Object; // Act await validationSummaryTagHelper.ProcessAsync(context: null, output: output); @@ -230,18 +224,6 @@ namespace Microsoft.AspNet.Mvc.TagHelpers public async Task ProcessAsync_GeneratesValidationSummaryWhenNotNone(ValidationSummary validationSummary) { // Arrange - var validationSummaryTagHelper = new ValidationSummaryTagHelper - { - ValidationSummary = validationSummary, - }; - var expectedPreContent = "original pre-content"; - var expectedContent = "original content"; - var output = new TagHelperOutput( - "div", - attributes: new TagHelperAttributeList()); - output.PreContent.SetContent(expectedPreContent); - output.Content.SetContent(expectedContent); - output.PostContent.SetContent("Content of validation message"); var tagBuilder = new TagBuilder("span2", new HtmlEncoder()) { InnerHtml = "New HTML" @@ -257,9 +239,23 @@ namespace Microsoft.AspNet.Mvc.TagHelpers It.IsAny())) .Returns(tagBuilder) .Verifiable(); + + var validationSummaryTagHelper = new ValidationSummaryTagHelper(generator.Object) + { + ValidationSummary = validationSummary, + }; + + var expectedPreContent = "original pre-content"; + var expectedContent = "original content"; + var output = new TagHelperOutput( + "div", + attributes: new TagHelperAttributeList()); + output.PreContent.SetContent(expectedPreContent); + output.Content.SetContent(expectedContent); + output.PostContent.SetContent("Content of validation message"); + var viewContext = CreateViewContext(); validationSummaryTagHelper.ViewContext = viewContext; - validationSummaryTagHelper.Generator = generator.Object; // Act await validationSummaryTagHelper.ProcessAsync(context: null, output: output); @@ -282,7 +278,9 @@ namespace Microsoft.AspNet.Mvc.TagHelpers ValidationSummary validationSummary) { // Arrange - var validationSummaryTagHelper = new ValidationSummaryTagHelper(); + var generator = new TestableHtmlGenerator(new EmptyModelMetadataProvider()); + + var validationSummaryTagHelper = new ValidationSummaryTagHelper(generator); var expectedMessage = string.Format( @"The value of argument 'value' ({0}) is invalid for Enum type 'Microsoft.AspNet.Mvc.ValidationSummary'. Parameter name: value", diff --git a/test/WebSites/ActivatorWebSite/TagHelpers/FooterTagHelper.cs b/test/WebSites/ActivatorWebSite/TagHelpers/FooterTagHelper.cs index a7d1eefd4d..e7f9bcfa42 100644 --- a/test/WebSites/ActivatorWebSite/TagHelpers/FooterTagHelper.cs +++ b/test/WebSites/ActivatorWebSite/TagHelpers/FooterTagHelper.cs @@ -2,23 +2,28 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.Mvc; -using Microsoft.AspNet.Mvc.Rendering; using Microsoft.AspNet.Razor.Runtime.TagHelpers; +using Microsoft.Framework.WebEncoders; namespace ActivatorWebSite.TagHelpers { [TargetElement("body")] public class FooterTagHelper : TagHelper { - [Activate] - public IHtmlHelper HtmlHelper { get; set; } + public FooterTagHelper(IHtmlEncoder encoder) + { + Encoder = encoder; + } - [Activate] - public ViewDataDictionary ViewData { get; set; } + public IHtmlEncoder Encoder { get; } + + [HtmlAttributeNotBound] + [ViewContext] + public ViewContext ViewContext { get; set; } public override void Process(TagHelperContext context, TagHelperOutput output) { - output.PostContent.SetContent($"
{HtmlHelper.Encode(ViewData["footer"])}
"); + output.PostContent.SetContent($""); } } } \ No newline at end of file diff --git a/test/WebSites/ActivatorWebSite/TagHelpers/HiddenTagHelper.cs b/test/WebSites/ActivatorWebSite/TagHelpers/HiddenTagHelper.cs index ab79046584..3b1dd1e58b 100644 --- a/test/WebSites/ActivatorWebSite/TagHelpers/HiddenTagHelper.cs +++ b/test/WebSites/ActivatorWebSite/TagHelpers/HiddenTagHelper.cs @@ -11,13 +11,23 @@ namespace ActivatorWebSite.TagHelpers [TargetElement("span")] public class HiddenTagHelper : TagHelper { - public string Name { get; set; } + public HiddenTagHelper(IHtmlHelper htmlHelper) + { + HtmlHelper = htmlHelper; + } - [Activate] - public IHtmlHelper HtmlHelper { get; set; } + public IHtmlHelper HtmlHelper { get; } + + [HtmlAttributeNotBound] + [ViewContext] + public ViewContext ViewContext { get; set; } + + public string Name { get; set; } public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output) { + (HtmlHelper as ICanHasViewContext)?.Contextualize(ViewContext); + var content = await context.GetChildContentAsync(); output.Content.SetContent(HtmlHelper.Hidden(Name, content).ToString()); diff --git a/test/WebSites/ActivatorWebSite/TagHelpers/RepeatContentTagHelper.cs b/test/WebSites/ActivatorWebSite/TagHelpers/RepeatContentTagHelper.cs index 6b4cb993d3..570f50cda4 100644 --- a/test/WebSites/ActivatorWebSite/TagHelpers/RepeatContentTagHelper.cs +++ b/test/WebSites/ActivatorWebSite/TagHelpers/RepeatContentTagHelper.cs @@ -11,15 +11,25 @@ namespace ActivatorWebSite.TagHelpers [TargetElement("div")] public class RepeatContentTagHelper : TagHelper { + public RepeatContentTagHelper(IHtmlHelper htmlHelper) + { + HtmlHelper = htmlHelper; + } + + public IHtmlHelper HtmlHelper { get; } + + [HtmlAttributeNotBound] + [ViewContext] + public ViewContext ViewContext { get; set; } + public int RepeatContent { get; set; } public ModelExpression Expression { get; set; } - [Activate] - public IHtmlHelper HtmlHelper { get; set; } - public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output) { + (HtmlHelper as ICanHasViewContext)?.Contextualize(ViewContext); + var content = await context.GetChildContentAsync(); var repeatContent = HtmlHelper.Encode(Expression.Model.ToString()); diff --git a/test/WebSites/ActivatorWebSite/TagHelpers/TitleTagHelper.cs b/test/WebSites/ActivatorWebSite/TagHelpers/TitleTagHelper.cs index e0826d0a44..865dc83fe5 100644 --- a/test/WebSites/ActivatorWebSite/TagHelpers/TitleTagHelper.cs +++ b/test/WebSites/ActivatorWebSite/TagHelpers/TitleTagHelper.cs @@ -4,21 +4,27 @@ using Microsoft.AspNet.Mvc; using Microsoft.AspNet.Mvc.Rendering; using Microsoft.AspNet.Razor.Runtime.TagHelpers; -using Microsoft.AspNet.Razor.TagHelpers; namespace ActivatorWebSite.TagHelpers { [TargetElement("body")] public class TitleTagHelper : TagHelper { - [Activate] - public IHtmlHelper HtmlHelper { get; set; } + public TitleTagHelper(IHtmlHelper htmlHelper) + { + HtmlHelper = htmlHelper; + } - [Activate] + public IHtmlHelper HtmlHelper { get; } + + [HtmlAttributeNotBound] + [ViewContext] public ViewContext ViewContext { get; set; } public override void Process(TagHelperContext context, TagHelperOutput output) { + (HtmlHelper as ICanHasViewContext)?.Contextualize(ViewContext); + var builder = new TagBuilder("h2", HtmlHelper.HtmlEncoder); var title = ViewContext.ViewBag.Title; builder.InnerHtml = HtmlHelper.Encode(title); diff --git a/test/WebSites/RequestServicesWebSite/RequestScopedTagHelper.cs b/test/WebSites/RequestServicesWebSite/RequestScopedTagHelper.cs index 2ef3a9ef20..f57e039784 100644 --- a/test/WebSites/RequestServicesWebSite/RequestScopedTagHelper.cs +++ b/test/WebSites/RequestServicesWebSite/RequestScopedTagHelper.cs @@ -1,16 +1,18 @@ // 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 Microsoft.AspNet.Mvc; using Microsoft.AspNet.Razor.Runtime.TagHelpers; -using Microsoft.AspNet.Razor.TagHelpers; namespace RequestServicesWebSite { public class RequestScopedTagHelper : TagHelper { - [Activate] - public RequestIdService RequestIdService { get; set; } + public RequestScopedTagHelper(RequestIdService service) + { + RequestIdService = service; + } + + public RequestIdService RequestIdService { get; } public override void Process(TagHelperContext context, TagHelperOutput output) { diff --git a/test/WebSites/TagHelpersWebSite/TagHelpers/ATagHelper.cs b/test/WebSites/TagHelpersWebSite/TagHelpers/ATagHelper.cs index 1bd97595c1..a9d2d4f586 100644 --- a/test/WebSites/TagHelpersWebSite/TagHelpers/ATagHelper.cs +++ b/test/WebSites/TagHelpersWebSite/TagHelpers/ATagHelper.cs @@ -9,9 +9,13 @@ namespace TagHelpersWebSite.TagHelpers { public class ATagHelper : TagHelper { - [Activate] + public ATagHelper(IUrlHelper urlHelper) + { + UrlHelper = urlHelper; + } + [HtmlAttributeNotBound] - public IUrlHelper UrlHelper { get; set; } + public IUrlHelper UrlHelper { get; } public string Controller { get; set; } diff --git a/test/WebSites/TagHelpersWebSite/TagHelpers/PrettyTagHelper.cs b/test/WebSites/TagHelpersWebSite/TagHelpers/PrettyTagHelper.cs index 812213bb6a..e459bb8265 100644 --- a/test/WebSites/TagHelpersWebSite/TagHelpers/PrettyTagHelper.cs +++ b/test/WebSites/TagHelpersWebSite/TagHelpers/PrettyTagHelper.cs @@ -25,7 +25,7 @@ namespace TagHelpersWebSite.TagHelpers public string Style { get; set; } - [Activate] + [ViewContext] [HtmlAttributeNotBound] public ViewContext ViewContext { get; set; } diff --git a/test/WebSites/TagHelpersWebSite/TagHelpers/TagCloudViewComponentTagHelper.cs b/test/WebSites/TagHelpersWebSite/TagHelpers/TagCloudViewComponentTagHelper.cs index d79e917cd8..43e8294238 100644 --- a/test/WebSites/TagHelpersWebSite/TagHelpers/TagCloudViewComponentTagHelper.cs +++ b/test/WebSites/TagHelpersWebSite/TagHelpers/TagCloudViewComponentTagHelper.cs @@ -25,8 +25,8 @@ namespace MvcSample.Web.Components public int Count { get; set; } - [Activate] [HtmlAttributeNotBound] + [ViewContext] public ViewContext ViewContext { get; set; } public int Order { get; } = 0;