Files
LibraryWeb/App_Code/ViewScriptTagHelper.cs
2026-08-04 14:41:21 +03:00

61 lines
1.9 KiB
C#

using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.AspNetCore.Razor.TagHelpers;
namespace Library;
public class ViewScriptTagHelper : TagHelper
{
private readonly IWebHostEnvironment environment;
private readonly IFileVersionProvider fileVersionProvider;
private const string AppendVersionAttributeName = "append-version";
public ViewScriptTagHelper( IWebHostEnvironment environment , IFileVersionProvider fileVersionProvider )
{
this.environment = environment;
this.fileVersionProvider = fileVersionProvider;
}
[ViewContext]
public ViewContext? ViewContext { get; set; }
/// <summary>
/// Value indicating if file version should be appended to src urls.
/// </summary>
/// <remarks>
/// A query string "v" with the encoded content of the file is added.
/// </remarks>
[HtmlAttributeName( AppendVersionAttributeName )]
public bool? AppendVersion { get; set; }
public override void Process( TagHelperContext context , TagHelperOutput output )
{
// remove the `page-script` tag if script doesn't exist
output.TagName = null;
output.TagMode = TagMode.StartTagAndEndTag;
var viewPath = ViewContext?.View.Path;
var src = $"{viewPath}.js";
/* When the app is published, the framework automatically moves the script to the web root.
So we should check both places, with the content root first for development */
var fileInfo = environment.ContentRootFileProvider.GetFileInfo(src) ??
environment.WebRootFileProvider.GetFileInfo(src);
if ( fileInfo is { Exists: true } )
{
// switch it to script now
output.TagName = "script";
output.Content = new DefaultTagHelperContent( );
if ( AppendVersion == true )
{
// people love their cache busting versions
src = fileVersionProvider.AddFileVersionToPath( src , src );
}
output.Attributes.Add( "src" , src );
}
}
}