如何实现 asp-append-version="true" 到 background-image 属性?
How to implement asp-append-version="true" to background-image property?
我正在尝试对我的图像实施 HTMLTagHelper asp-append-version="true"
。
问题是关于 DOM 分布,我没有将属性分配给 <img>
标签,而是分配给包含带有 background-url
[=38= 的图像的 <div>
].
此外,div 是在所有 DOM 加载之前生成的,我不知道是否会有不同的方法。
一个很明显,将 div
更改为 img
标签,但我不想要它,因为我的设计必须保持不变。
我的javascript一直是这样的:
cardHTML += '<div asp-append-version="true" class="card littleCard" style="background-image: url(/Content/Img/Especialistas/LittleCard/' + especialista.idEspecialista + '.jpg' + ')' + '" >';
cardHTML += '</div>';
asp-append-version="true"
不适用于 div
标签。
关于如何找到处理此问题的方法的任何想法?
谢谢
您可以创建自定义 TagHelper
以定位所有具有内联样式属性的元素。我试过的以下示例看起来工作正常,但如果您想要更标准的东西(类似于 ImageTagHelper
,...),您可以尝试查看基础 class UrlResolutionTagHelper。我不太确定为什么它需要更复杂,基本上你需要在实际处理更多之前解决 URL 。我试过一个简单的 IFileVersionProvider
并且它也适用于相对路径(当然解析路径应该在当前服务器的网络根目录)。
下面的简单示例适用于 HtmlString
的属性值(这几乎是通常的情况,一些自定义渲染可能会注入 IHtmlContent
而不是 HtmlString
,对于这样的比较复杂的情况,可以参考UrlResolutionTagHelper的源码,甚至复制几乎一模一样的相关代码也可以):
//target only elements having an inline style attribute
[HtmlTargetElement(Attributes = "style")]
public class InlineStyleBackgroundElementTagHelper : TagHelper
{
readonly IFileVersionProvider _fileVersionProvider;
const string BACKGROUND_URL_PATTERN = "(background(?:-image)?\s*:[^;]*url)(\([^)]+\))";
public InlineStyleBackgroundElementTagHelper(IFileVersionProvider fileVersionProvider)
{
_fileVersionProvider = fileVersionProvider;
}
//bind the asp-append-version property
[HtmlAttributeName("asp-append-version")]
public bool AppendsVersion { get; set; }
//inject ViewContext from the current request
[HtmlAttributeNotBound]
[ViewContext]
public ViewContext ViewContext { get; set; }
public override void Process(TagHelperContext context, TagHelperOutput output)
{
if (AppendsVersion)
{
if (output.Attributes.TryGetAttribute("style", out var styleAttr))
{
//the value here should be an HtmlString, so this basically
//gets the raw plain string of the style attribute's value
var inlineStyle = styleAttr.Value.ToString();
var basePath = ViewContext.HttpContext.Request.PathBase;
inlineStyle = Regex.Replace(inlineStyle, BACKGROUND_URL_PATTERN, m =>
{
//extract the background url contained in the inline style
var backgroundUrl = m.Groups[2].Value.Trim('(', ')', ' ');
//append the version
var versionedUrl = _fileVersionProvider.AddFileVersionToPath(basePath, backgroundUrl);
//format back the inline style with the versioned url
return $"{m.Groups[1]}({versionedUrl})";
}, RegexOptions.Compiled | RegexOptions.IgnoreCase);
output.Attributes.SetAttribute("style", inlineStyle);
}
}
}
}
用法:就像你在其他内置标签上使用asp-append-version
一样有帮助。 (就像你的例子一样)。
我正在尝试对我的图像实施 HTMLTagHelper asp-append-version="true"
。
问题是关于 DOM 分布,我没有将属性分配给 <img>
标签,而是分配给包含带有 background-url
[=38= 的图像的 <div>
].
此外,div 是在所有 DOM 加载之前生成的,我不知道是否会有不同的方法。
一个很明显,将 div
更改为 img
标签,但我不想要它,因为我的设计必须保持不变。
我的javascript一直是这样的:
cardHTML += '<div asp-append-version="true" class="card littleCard" style="background-image: url(/Content/Img/Especialistas/LittleCard/' + especialista.idEspecialista + '.jpg' + ')' + '" >';
cardHTML += '</div>';
asp-append-version="true"
不适用于 div
标签。
关于如何找到处理此问题的方法的任何想法?
谢谢
您可以创建自定义 TagHelper
以定位所有具有内联样式属性的元素。我试过的以下示例看起来工作正常,但如果您想要更标准的东西(类似于 ImageTagHelper
,...),您可以尝试查看基础 class UrlResolutionTagHelper。我不太确定为什么它需要更复杂,基本上你需要在实际处理更多之前解决 URL 。我试过一个简单的 IFileVersionProvider
并且它也适用于相对路径(当然解析路径应该在当前服务器的网络根目录)。
下面的简单示例适用于 HtmlString
的属性值(这几乎是通常的情况,一些自定义渲染可能会注入 IHtmlContent
而不是 HtmlString
,对于这样的比较复杂的情况,可以参考UrlResolutionTagHelper的源码,甚至复制几乎一模一样的相关代码也可以):
//target only elements having an inline style attribute
[HtmlTargetElement(Attributes = "style")]
public class InlineStyleBackgroundElementTagHelper : TagHelper
{
readonly IFileVersionProvider _fileVersionProvider;
const string BACKGROUND_URL_PATTERN = "(background(?:-image)?\s*:[^;]*url)(\([^)]+\))";
public InlineStyleBackgroundElementTagHelper(IFileVersionProvider fileVersionProvider)
{
_fileVersionProvider = fileVersionProvider;
}
//bind the asp-append-version property
[HtmlAttributeName("asp-append-version")]
public bool AppendsVersion { get; set; }
//inject ViewContext from the current request
[HtmlAttributeNotBound]
[ViewContext]
public ViewContext ViewContext { get; set; }
public override void Process(TagHelperContext context, TagHelperOutput output)
{
if (AppendsVersion)
{
if (output.Attributes.TryGetAttribute("style", out var styleAttr))
{
//the value here should be an HtmlString, so this basically
//gets the raw plain string of the style attribute's value
var inlineStyle = styleAttr.Value.ToString();
var basePath = ViewContext.HttpContext.Request.PathBase;
inlineStyle = Regex.Replace(inlineStyle, BACKGROUND_URL_PATTERN, m =>
{
//extract the background url contained in the inline style
var backgroundUrl = m.Groups[2].Value.Trim('(', ')', ' ');
//append the version
var versionedUrl = _fileVersionProvider.AddFileVersionToPath(basePath, backgroundUrl);
//format back the inline style with the versioned url
return $"{m.Groups[1]}({versionedUrl})";
}, RegexOptions.Compiled | RegexOptions.IgnoreCase);
output.Attributes.SetAttribute("style", inlineStyle);
}
}
}
}
用法:就像你在其他内置标签上使用asp-append-version
一样有帮助。 (就像你的例子一样)。