Skip to content

Instantly share code, notes, and snippets.

@DamianEdwards
Created September 5, 2019 22:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save DamianEdwards/51c961a1597ec133bd4d5eef30efd9ca to your computer and use it in GitHub Desktop.
Save DamianEdwards/51c961a1597ec133bd4d5eef30efd9ca to your computer and use it in GitHub Desktop.
ComponentTagHelper
using System;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Html;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.AspNetCore.Razor.TagHelpers;
namespace SampleTagHelpers
{
[HtmlTargetElement("component")]
public class ComponentTagHelper : TagHelper
{
private readonly IHtmlHelper _htmlHelper;
public ComponentTagHelper(IHtmlHelper htmlHelper)
{
_htmlHelper = htmlHelper;
}
public Type Type { get; set; }
public RenderMode RenderMode { get; set; }
public object Parameters { get; set; }
[HtmlAttributeNotBound]
[ViewContext]
public ViewContext ViewContext { get; set; }
public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
{
// TODO: Validate argument values, e.g. Type should be IComponent
((IViewContextAware)_htmlHelper).Contextualize(ViewContext);
// There should probably be a non-generic overload of IHtmlHelper.RenderComponentAsync which would make the need for
// the following reflection malarky go away.
var renderHelper = typeof(HtmlHelperComponentExtensions)
.GetMethod(name: nameof(HtmlHelperComponentExtensions.RenderComponentAsync),
genericParameterCount: 1,
types: new[] { typeof(IHtmlHelper), typeof(RenderMode), typeof(object) });
var renderDelegate = renderHelper.MakeGenericMethod(Type)
.CreateDelegate(typeof(Func<IHtmlHelper, RenderMode, object, Task<IHtmlContent>>));
var renderAsyncThunk = (Func<IHtmlHelper, RenderMode, object, Task<IHtmlContent>>)renderDelegate;
output.Content.SetHtmlContent(await renderAsyncThunk(_htmlHelper, RenderMode, Parameters));
output.TagName = null;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment