From 9fcf31fa43340a21b4095561c24ecd693ed929ec Mon Sep 17 00:00:00 2001 From: Ajay Bhargav Baaskaran Date: Mon, 16 Feb 2015 14:47:55 -0800 Subject: [PATCH] Activate ViewDataDictionary in DefaultTagHelperActivator --- .../DefaultTagHelperActivator.cs | 9 +++- .../ActivatorTests.cs | 1 + .../RazorPageCreateTagHelperTest.cs | 42 +++++++++++++++++++ .../TagHelpers/FooterTagHelper.cs | 24 +++++++++++ .../Views/View/UseTagHelper.cshtml | 1 + 5 files changed, 75 insertions(+), 2 deletions(-) create mode 100644 test/WebSites/ActivatorWebSite/TagHelpers/FooterTagHelper.cs diff --git a/src/Microsoft.AspNet.Mvc.Razor/DefaultTagHelperActivator.cs b/src/Microsoft.AspNet.Mvc.Razor/DefaultTagHelperActivator.cs index d575e85d95..63e707d231 100644 --- a/src/Microsoft.AspNet.Mvc.Razor/DefaultTagHelperActivator.cs +++ b/src/Microsoft.AspNet.Mvc.Razor/DefaultTagHelperActivator.cs @@ -43,17 +43,22 @@ namespace Microsoft.AspNet.Mvc.Razor private static PropertyActivator CreateActivateInfo(PropertyInfo property) { Func valueAccessor; + var propertyType = property.PropertyType; - if (property.PropertyType == typeof(ViewContext)) + 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(property.PropertyType); + var service = serviceProvider.GetRequiredService(propertyType); var contextable = service as ICanHasViewContext; contextable?.Contextualize(viewContext); diff --git a/test/Microsoft.AspNet.Mvc.FunctionalTests/ActivatorTests.cs b/test/Microsoft.AspNet.Mvc.FunctionalTests/ActivatorTests.cs index 5b3190feea..32298bce09 100644 --- a/test/Microsoft.AspNet.Mvc.FunctionalTests/ActivatorTests.cs +++ b/test/Microsoft.AspNet.Mvc.FunctionalTests/ActivatorTests.cs @@ -187,6 +187,7 @@ namespace Microsoft.AspNet.Mvc.FunctionalTests "" + "" + Environment.NewLine + + "
Footer from activated ViewData
" + ""; // Act diff --git a/test/Microsoft.AspNet.Mvc.Razor.Test/RazorPageCreateTagHelperTest.cs b/test/Microsoft.AspNet.Mvc.Razor.Test/RazorPageCreateTagHelperTest.cs index 29edf2a2b0..7544500cdf 100644 --- a/test/Microsoft.AspNet.Mvc.Razor.Test/RazorPageCreateTagHelperTest.cs +++ b/test/Microsoft.AspNet.Mvc.Razor.Test/RazorPageCreateTagHelperTest.cs @@ -56,6 +56,33 @@ 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() { @@ -120,12 +147,27 @@ namespace Microsoft.AspNet.Mvc.Razor public ViewContext ViewContext { get; set; } } + private class ViewDataTagHelper : TagHelper + { + [Activate] + 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/WebSites/ActivatorWebSite/TagHelpers/FooterTagHelper.cs b/test/WebSites/ActivatorWebSite/TagHelpers/FooterTagHelper.cs new file mode 100644 index 0000000000..4dd643184c --- /dev/null +++ b/test/WebSites/ActivatorWebSite/TagHelpers/FooterTagHelper.cs @@ -0,0 +1,24 @@ +// Copyright (c) Microsoft Open Technologies, Inc. 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.Mvc.Rendering; +using Microsoft.AspNet.Razor.Runtime.TagHelpers; + +namespace ActivatorWebSite.TagHelpers +{ + [HtmlElementName("body")] + public class FooterTagHelper : TagHelper + { + [Activate] + public IHtmlHelper HtmlHelper { get; set; } + + [Activate] + public ViewDataDictionary ViewData { get; set; } + + public override void Process(TagHelperContext context, TagHelperOutput output) + { + output.PostContent = $""; + } + } +} \ No newline at end of file diff --git a/test/WebSites/ActivatorWebSite/Views/View/UseTagHelper.cshtml b/test/WebSites/ActivatorWebSite/Views/View/UseTagHelper.cshtml index 51796061ac..10341d3aba 100644 --- a/test/WebSites/ActivatorWebSite/Views/View/UseTagHelper.cshtml +++ b/test/WebSites/ActivatorWebSite/Views/View/UseTagHelper.cshtml @@ -5,6 +5,7 @@ @{ ViewBag.Title = "Activation Test"; + ViewData["footer"] = "Footer from activated ViewData"; }