public void WriteViewComponentTagHelper(CodeRenderingContext context, ViewComponentTagHelperIntermediateNode node) { // Add target element. WriteTargetElementString(context.CodeWriter, node.TagHelper); // Initialize declaration. using (context.CodeWriter.BuildClassDeclaration( PublicModifiers, node.ClassName, TagHelperTypeName, interfaces: null, typeParameters: null)) { // Add view component helper. context.CodeWriter.WriteVariableDeclaration( $"private readonly {ViewComponentHelperTypeName}", ViewComponentHelperVariableName, value: null); // Add constructor. WriteConstructorString(context.CodeWriter, node.ClassName); // Add attributes. WriteAttributeDeclarations(context.CodeWriter, node.TagHelper); // Add process method. WriteProcessMethodString(context.CodeWriter, node.TagHelper); } }
private void AddTagHelperClass(Context context, TagHelperDescriptor tagHelper) { var node = new ViewComponentTagHelperIntermediateNode() { ClassName = context.GetClassName(tagHelper), TagHelper = tagHelper }; context.Class.Children.Add(node); }
public void WriteViewComponentTagHelper_GeneratesViewComponentTagHelper_WithIndexer() { // Arrange var tagHelper = TagHelperDescriptorBuilder .Create(ViewComponentTagHelperConventions.Kind, "TestTagHelper", "TestAssembly") .TypeName("__Generated__TagCloudViewComponentTagHelper") .BoundAttributeDescriptor(attribute => attribute .Name("Foo") .TypeName("System.Collections.Generic.Dictionary<System.String, System.Int32>") .PropertyName("Tags") .AsDictionaryAttribute("foo-", "System.Int32")) .TagMatchingRuleDescriptor(rule => rule.RequireTagName("tagcloud")) .AddMetadata(ViewComponentTagHelperMetadata.Name, "TagCloud") .Build(); var extension = new ViewComponentTagHelperTargetExtension(); var context = TestCodeRenderingContext.CreateRuntime(); var node = new ViewComponentTagHelperIntermediateNode() { ClassName = "__Generated__TagCloudViewComponentTagHelper", TagHelper = tagHelper }; // Act extension.WriteViewComponentTagHelper(context, node); // Assert var csharp = context.CodeWriter.GenerateCode(); Assert.Equal( @"[Microsoft.AspNetCore.Razor.TagHelpers.HtmlTargetElementAttribute(""tagcloud"")] public class __Generated__TagCloudViewComponentTagHelper : Microsoft.AspNetCore.Razor.TagHelpers.TagHelper { private readonly global::Microsoft.AspNetCore.Mvc.IViewComponentHelper _helper = null; public __Generated__TagCloudViewComponentTagHelper(global::Microsoft.AspNetCore.Mvc.IViewComponentHelper helper) { _helper = helper; } [Microsoft.AspNetCore.Razor.TagHelpers.HtmlAttributeNotBoundAttribute, global::Microsoft.AspNetCore.Mvc.ViewFeatures.ViewContextAttribute] public global::Microsoft.AspNetCore.Mvc.Rendering.ViewContext ViewContext { get; set; } public System.Collections.Generic.Dictionary<System.String, System.Int32> Tags { get; set; } = new System.Collections.Generic.Dictionary<System.String, System.Int32>(); public override async global::System.Threading.Tasks.Task ProcessAsync(Microsoft.AspNetCore.Razor.TagHelpers.TagHelperContext context, Microsoft.AspNetCore.Razor.TagHelpers.TagHelperOutput output) { (_helper as global::Microsoft.AspNetCore.Mvc.ViewFeatures.IViewContextAware)?.Contextualize(ViewContext); var content = await _helper.InvokeAsync(""TagCloud"", new { Tags }); output.TagName = null; output.Content.SetHtmlContent(content); } } ", csharp, ignoreLineEndingDifferences: true); }