From 0cfd5363f8f27b3e5c043f2cc8813730938627b7 Mon Sep 17 00:00:00 2001 From: Ajay Bhargav Baaskaran Date: Thu, 15 Sep 2016 17:12:43 -0700 Subject: [PATCH] Added ViewComponentTagHelperDescriptorResolver and related stuff --- .../GeneratedViewComponentTagHelperContext.cs | 6 ++++ .../ViewComponentTagHelperChunkVisitor.cs | 2 +- .../MvcRazorMvcCoreBuilderExtensions.cs | 6 +++- .../CompositeTagHelperDescriptorResolver.cs | 36 +++++++++++++++++++ ...iewComponentTagHelperDescriptorResolver.cs | 31 ++++++++++++++++ .../ViewComponentTagHelperChunkVisitorTest.cs | 1 - .../GeneratedViewComponentTagHelperClasses.cs | 4 +-- 7 files changed, 81 insertions(+), 5 deletions(-) create mode 100644 src/Microsoft.AspNetCore.Mvc.Razor/Internal/CompositeTagHelperDescriptorResolver.cs create mode 100644 src/Microsoft.AspNetCore.Mvc.Razor/Internal/ViewComponentTagHelperDescriptorResolver.cs diff --git a/src/Microsoft.AspNetCore.Mvc.Razor.Host/Internal/GeneratedViewComponentTagHelperContext.cs b/src/Microsoft.AspNetCore.Mvc.Razor.Host/Internal/GeneratedViewComponentTagHelperContext.cs index 8008fe71e9..b72d7399c0 100644 --- a/src/Microsoft.AspNetCore.Mvc.Razor.Host/Internal/GeneratedViewComponentTagHelperContext.cs +++ b/src/Microsoft.AspNetCore.Mvc.Razor.Host/Internal/GeneratedViewComponentTagHelperContext.cs @@ -17,6 +17,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Host.Internal InvokeAsyncMethodName = "InvokeAsync"; IViewComponentHelperTypeName = "Microsoft.AspNetCore.Mvc.IViewComponentHelper"; IViewContextAwareTypeName = "Microsoft.AspNetCore.Mvc.ViewFeatures.IViewContextAware"; + ViewContextAttributeTypeName = "Microsoft.AspNetCore.Mvc.ViewFeatures.ViewContextAttribute"; ViewContextTypeName = "Microsoft.AspNetCore.Mvc.Rendering.ViewContext"; } @@ -44,5 +45,10 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Host.Internal /// Name of the ViewContext type for view execution. /// public string ViewContextTypeName { get; set; } + + /// + /// Name of the ViewContextAttribute type for view execution. + /// + public string ViewContextAttributeTypeName { get; set; } } } \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Mvc.Razor.Host/Internal/ViewComponentTagHelperChunkVisitor.cs b/src/Microsoft.AspNetCore.Mvc.Razor.Host/Internal/ViewComponentTagHelperChunkVisitor.cs index 1229412237..6ab3a03779 100644 --- a/src/Microsoft.AspNetCore.Mvc.Razor.Host/Internal/ViewComponentTagHelperChunkVisitor.cs +++ b/src/Microsoft.AspNetCore.Mvc.Razor.Host/Internal/ViewComponentTagHelperChunkVisitor.cs @@ -119,7 +119,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Host.Internal Writer.Write("[") .Write(typeof(HtmlAttributeNotBoundAttribute).FullName) .WriteParameterSeparator() - .Write($"global::{_context.ViewContextTypeName}") + .Write($"global::{_context.ViewContextAttributeTypeName}") .WriteLine("]"); Writer.WriteAutoPropertyDeclaration( diff --git a/src/Microsoft.AspNetCore.Mvc.Razor/DependencyInjection/MvcRazorMvcCoreBuilderExtensions.cs b/src/Microsoft.AspNetCore.Mvc.Razor/DependencyInjection/MvcRazorMvcCoreBuilderExtensions.cs index 8e38d7f1b3..9ed52055fe 100644 --- a/src/Microsoft.AspNetCore.Mvc.Razor/DependencyInjection/MvcRazorMvcCoreBuilderExtensions.cs +++ b/src/Microsoft.AspNetCore.Mvc.Razor/DependencyInjection/MvcRazorMvcCoreBuilderExtensions.cs @@ -165,7 +165,11 @@ namespace Microsoft.Extensions.DependencyInjection services.TryAddSingleton(); services.TryAddSingleton(s => new TagHelperDescriptorFactory(designTime: false)); - services.TryAddSingleton(); + services.TryAddSingleton(); + + // And ViewComponentTagHelper resolver. + services.TryAddSingleton(); + services.TryAddSingleton(); // Caches compilation artifacts across the lifetime of the application. services.TryAddSingleton(); diff --git a/src/Microsoft.AspNetCore.Mvc.Razor/Internal/CompositeTagHelperDescriptorResolver.cs b/src/Microsoft.AspNetCore.Mvc.Razor/Internal/CompositeTagHelperDescriptorResolver.cs new file mode 100644 index 0000000000..c276dc32c7 --- /dev/null +++ b/src/Microsoft.AspNetCore.Mvc.Razor/Internal/CompositeTagHelperDescriptorResolver.cs @@ -0,0 +1,36 @@ +// 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.Collections.Generic; +using Microsoft.AspNetCore.Razor.Compilation.TagHelpers; +using Microsoft.AspNetCore.Razor.Runtime.TagHelpers; + +namespace Microsoft.AspNetCore.Mvc.Razor.Internal +{ + public class CompositeTagHelperDescriptorResolver : ITagHelperDescriptorResolver + { + public IList _resolvers; + + public CompositeTagHelperDescriptorResolver( + TagHelperDescriptorResolver tagHelperDescriptorResolver, + ViewComponentTagHelperDescriptorResolver viewComponentTagHelperDescriptorResolver) + { + _resolvers = new List(); + _resolvers.Add(tagHelperDescriptorResolver); + _resolvers.Add(viewComponentTagHelperDescriptorResolver); + } + + public IEnumerable Resolve(TagHelperDescriptorResolutionContext resolutionContext) + { + var descriptors = new List(); + + foreach (var resolver in _resolvers) + { + var currentDescriptors = resolver.Resolve(resolutionContext); + descriptors.AddRange(currentDescriptors); + } + + return descriptors; + } + } +} diff --git a/src/Microsoft.AspNetCore.Mvc.Razor/Internal/ViewComponentTagHelperDescriptorResolver.cs b/src/Microsoft.AspNetCore.Mvc.Razor/Internal/ViewComponentTagHelperDescriptorResolver.cs new file mode 100644 index 0000000000..090d58f5bb --- /dev/null +++ b/src/Microsoft.AspNetCore.Mvc.Razor/Internal/ViewComponentTagHelperDescriptorResolver.cs @@ -0,0 +1,31 @@ +// 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.Collections.Generic; +using Microsoft.AspNetCore.Mvc.ViewComponents; +using Microsoft.AspNetCore.Razor; +using Microsoft.AspNetCore.Razor.Compilation.TagHelpers; +using Microsoft.AspNetCore.Razor.Runtime.TagHelpers; + +namespace Microsoft.AspNetCore.Mvc.Razor.Internal +{ + public class ViewComponentTagHelperDescriptorResolver : TagHelperDescriptorResolver + { + ViewComponentTagHelperDescriptorFactory _descriptorFactory; + + public ViewComponentTagHelperDescriptorResolver( + IViewComponentDescriptorProvider viewComponentDescriptorProvider) + : base(designTime: true) + { + _descriptorFactory = new ViewComponentTagHelperDescriptorFactory(viewComponentDescriptorProvider); + } + + protected override IEnumerable ResolveDescriptorsInAssembly( + string assemblyName, + SourceLocation documentLocation, + ErrorSink errorSink) + { + return _descriptorFactory.CreateDescriptors(assemblyName); + } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNetCore.Mvc.Razor.Host.Test/Internal/ViewComponentTagHelperChunkVisitorTest.cs b/test/Microsoft.AspNetCore.Mvc.Razor.Host.Test/Internal/ViewComponentTagHelperChunkVisitorTest.cs index ecb9993dad..b3dc7fb59c 100644 --- a/test/Microsoft.AspNetCore.Mvc.Razor.Host.Test/Internal/ViewComponentTagHelperChunkVisitorTest.cs +++ b/test/Microsoft.AspNetCore.Mvc.Razor.Host.Test/Internal/ViewComponentTagHelperChunkVisitorTest.cs @@ -1,7 +1,6 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; using System.Collections.Generic; using System.Reflection; using Microsoft.AspNetCore.Mvc.Razor.Host.Internal; diff --git a/test/Microsoft.AspNetCore.Mvc.Razor.Host.Test/TestFiles/Output/Runtime/GeneratedViewComponentTagHelperClasses.cs b/test/Microsoft.AspNetCore.Mvc.Razor.Host.Test/TestFiles/Output/Runtime/GeneratedViewComponentTagHelperClasses.cs index 5556074723..c9a10c3b54 100644 --- a/test/Microsoft.AspNetCore.Mvc.Razor.Host.Test/TestFiles/Output/Runtime/GeneratedViewComponentTagHelperClasses.cs +++ b/test/Microsoft.AspNetCore.Mvc.Razor.Host.Test/TestFiles/Output/Runtime/GeneratedViewComponentTagHelperClasses.cs @@ -6,7 +6,7 @@ public class __Generated__FooViewComponentTagHelper : Microsoft.AspNetCore.Razor { _viewComponentHelper = viewComponentHelper; } - [Microsoft.AspNetCore.Razor.TagHelpers.HtmlAttributeNotBoundAttribute, global::Microsoft.AspNetCore.Mvc.Rendering.ViewContext] + [Microsoft.AspNetCore.Razor.TagHelpers.HtmlAttributeNotBoundAttribute, global::Microsoft.AspNetCore.Mvc.ViewFeatures.ViewContextAttribute] public global::Microsoft.AspNetCore.Mvc.Rendering.ViewContext ViewContext { get; set; } public System.String Attribute { get; set; } public override async global::System.Threading.Tasks.Task ProcessAsync(Microsoft.AspNetCore.Razor.TagHelpers.TagHelperContext context, Microsoft.AspNetCore.Razor.TagHelpers.TagHelperOutput output) @@ -25,7 +25,7 @@ public class __Generated__BarViewComponentTagHelper : Microsoft.AspNetCore.Razor { _viewComponentHelper = viewComponentHelper; } - [Microsoft.AspNetCore.Razor.TagHelpers.HtmlAttributeNotBoundAttribute, global::Microsoft.AspNetCore.Mvc.Rendering.ViewContext] + [Microsoft.AspNetCore.Razor.TagHelpers.HtmlAttributeNotBoundAttribute, global::Microsoft.AspNetCore.Mvc.ViewFeatures.ViewContextAttribute] public global::Microsoft.AspNetCore.Mvc.Rendering.ViewContext ViewContext { get; set; } public System.String Attribute { get; set; } public override async global::System.Threading.Tasks.Task ProcessAsync(Microsoft.AspNetCore.Razor.TagHelpers.TagHelperContext context, Microsoft.AspNetCore.Razor.TagHelpers.TagHelperOutput output)