Integrating Google Analytics using dependency injection in ASP.NET Core

Integrating Google Analytics in your website is not very complicated. You just need to copy the snippet in the head tag of your page. But, there are another way to integrate it. Since ASP.NET Core 2.0, you can create a Tag Helper Component. A Tag Helper Component is a Tag Helper that allows you to conditionally modify or add HTML elements from server-side code. This allows you, for instance, to add some html at the end of the head tag, or at the beginning of the body tag.

The code for a Tag Helper Component is almost like a Tag Helper, except you have to check which tag is currently processed. For instance, if you want to inject some code in the head tag, you'll have to check the current tag is actually head.

public class GoogleAnalyticsOptions
{
    public string TrackingCode { get; set; }
}

public class GoogleAnalyticsTagHelperComponent : TagHelperComponent
{
    private readonly GoogleAnalyticsOptions _googleAnalyticsOptions;

    public GoogleAnalyticsTagHelperComponent(IOptions<GoogleAnalyticsOptions> googleAnalyticsOptions)
    {
        _googleAnalyticsOptions = googleAnalyticsOptions.Value;
    }

    public override void Process(TagHelperContext context, TagHelperOutput output)
    {
        // Inject the code only in the head element
        if (string.Equals(output.TagName, "head", StringComparison.OrdinalIgnoreCase))
        {
            // Get the tracking code from the configuration
            var trackingCode = _googleAnalyticsOptions.TrackingCode;
            if (!string.IsNullOrEmpty(trackingCode))
            {
                // PostContent correspond to the text just before closing tag
                output.PostContent
                    .AppendHtml("<script async src='https://www.googletagmanager.com/gtag/js?id=")
                    .AppendHtml(trackingCode)
                    .AppendHtml("'></script><script>window.dataLayer=window.dataLayer||[];function gtag(){dataLayer.push(arguments)}gtag('js',new Date);gtag('config','")
                    .AppendHtml(trackingCode)
                    .AppendHtml("',{displayFeaturesTask:'null'});</script>");
            }
        }
    }
}

You can then register the Tag Helper Component in the Startup class in the list of services:

public partial class Startup
{
    public Startup(IHostingEnvironment env)
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
            .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
            .AddEnvironmentVariables();

        Configuration = builder.Build();
    }

    public IConfigurationRoot Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        // Register the Google Analytics configuration
        services.Configure<GoogleAnalyticsOptions>(options => Configuration.GetSection("GoogleAnalytics").Bind(options));

        // Register the TagHelperComponent
        services.AddTransient<ITagHelperComponent, GoogleAnalyticsTagHelperComponent>();
    }
}

Finally, you have to set the tracking code in the appsettings.json file:

{
    "GoogleAnalytics": {
        "TrackingCode": "UA-12345678-9"
    }
}

You can check the code is injected at the end of the head element:

Generated html code

Leave a reply