File: TagHelpers\TagCloudViewComponentTagHelper.cs
Web Access
Project: src\src\Mvc\test\WebSites\TagHelpersWebSite\TagHelpersWebSite.csproj (TagHelpersWebSite)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Reflection;
using System.Text.Encodings.Web;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.AspNetCore.Mvc.ViewComponents;
using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.AspNetCore.Razor.TagHelpers;
 
namespace MvcSample.Web.Components;
 
[HtmlTargetElement("tag-cloud")]
[ViewComponent(Name = "Tags")]
public class TagCloudViewComponentTagHelper : ITagHelper
{
    private static readonly string[] Tags =
        ("Lorem ipsum dolor sit amet consectetur adipisicing elit sed do eiusmod tempor incididunt ut labore et dolore magna aliqua" +
         "Ut enim ad minim veniam quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat Duis aute irure " +
         "dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur Excepteur sint occaecat cupidatat" +
         "non proident, sunt in culpa qui officia deserunt mollit anim id est laborum")
            .Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)
            .ToArray();
    private readonly HtmlEncoder _htmlEncoder;
 
    public TagCloudViewComponentTagHelper(HtmlEncoder htmlEncoder)
    {
        _htmlEncoder = htmlEncoder;
    }
 
    public int Count { get; set; }
 
    [HtmlAttributeNotBound]
    [ViewContext]
    public ViewContext ViewContext { get; set; }
 
    public int Order { get; } = 0;
 
    public void Init(TagHelperContext context)
    {
    }
 
    public async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
    {
        var result = await InvokeAsync(Count);
        var writer = new StringWriter();
 
        var viewComponentDescriptor = new ViewComponentDescriptor()
        {
            TypeInfo = typeof(TagCloudViewComponentTagHelper).GetTypeInfo(),
            ShortName = "TagCloudViewComponentTagHelper",
            FullName = "TagCloudViewComponentTagHelper",
        };
 
        await result.ExecuteAsync(new ViewComponentContext(
            viewComponentDescriptor,
            new Dictionary<string, object>(),
            _htmlEncoder,
            ViewContext,
            writer));
 
        output.TagName = null;
        output.Content.AppendHtml(writer.ToString());
    }
 
    public async Task<IViewComponentResult> InvokeAsync(int count)
    {
        var tags = await GetTagsAsync(count);
 
        return new ContentViewComponentResult(string.Join(",", tags));
    }
 
    private Task<string[]> GetTagsAsync(int count)
    {
        return Task.FromResult(GetTags(count));
    }
 
    private string[] GetTags(int count)
    {
        return Tags.Take(count).ToArray();
    }
}