【问题标题】:TagHelper for <meta> tags<meta> 标签的 TagHelper
【发布时间】:2017-05-29 14:44:51
【问题描述】:

我正在尝试使用TagHelpers 重写我网站中的一些meta 标签。

对于每个具有以下属性的meta 标记:data-data-main,data-src,我想替换其中一个属性的值。

例如,这是原文:

<meta name="js" content="script" data-async="true" data-data-main="requirejs/product-overview/init" data-src="/js/libs/require.js">

我想把它变成这样:

<meta name="js" content="script" data-async="true" data-data-main="http://cdn.website.nl/8c87f33ca5acc7fdb9186d6a497642784685aabade058d3530bdf6d30168cfcd.js" data-src="/js/libs/require.js">

唯一改变的是data-data-main 属性:它现在指向CDN 上的URL,而不是本地文件。

我定制了一个TagHelper 来帮助我实现这个目标:

[HtmlTargetElement("meta", Attributes = "[data-data-main],[data-src]")]
public class MetaScriptTagHelper : TagHelper
{
    private readonly BluenotionSiteSettings _bnSiteSettings;
    private readonly SiteTemplateService _templateService;

    public MetaScriptTagHelper(BluenotionSiteSettingsFiller bnSiteSettingsFiller, SiteTemplateService templateService)
    {
        _bnSiteSettings = bnSiteSettingsFiller.Create(HttpContext);
        _templateService = templateService;
    }

    [ViewContext]
    public ViewContext ViewContext { get; set; }

    private HttpContext HttpContext => ViewContext.HttpContext;

    public override void Process(
        TagHelperContext context, TagHelperOutput output)
    {
        var dataDataMainValue = context.AllAttributes["data-data-main"].Value.ToString();
        var localPath = @".\wwwroot\js\" + dataDataMainValue.Replace('/', '\\') + ".js";
        var siteTemplateId = _templateService.SiteTemplateBySiteIdAsync(_bnSiteSettings.SiteId);
        var cdnPath = _templateService.GetResourceByName(siteTemplateId, localPath);
        output.Attributes.Add("data-data-main", cdnPath);
    }
}

不幸的是,它返回了一个异常:

找到格式错误的“元”标签助手。标签助手必须有一个开始和结束标签或者是自闭的。

(没有进一步的堆栈跟踪/信息来指示格式错误的元标记是什么)

我无法调试格式错误的meta 标签是什么,所以我不知道问题出在哪里。有什么建议吗?

【问题讨论】:

    标签: asp.net-core tag-helpers


    【解决方案1】:

    好的,我觉得在发布问题之前没有检查这个真的很愚蠢,但很明显,是 输入 搞砸了TagHelper

    上面写着Tag helpers must have a start and end tag or be self closing. 显然,这意味着进来的meta 元素必须有一个结束标签或者是自闭合的,这(如我之前/之后的示例所示)我的meta 元素没有.

    所以要修复,我只需让输入 meta 标签自动关闭(即在关闭 &gt; 之前添加 /):

    <meta name="js" content="script" data-async="true" data-data-main="requirejs/product-overview/init" data-src="/js/libs/require.js"/>`
    

    【讨论】:

    • 嗯,不应该是正斜杠/吗?
    • 如果您希望 TagHelper 允许它是非自闭合的,您还可以指定 TagStructure 为 TagStructure.WithoutEndTag。示例:github.com/aspnet/Mvc/blob/dev/src/…
    猜你喜欢
    • 2015-10-25
    • 2016-02-07
    • 2011-10-30
    • 1970-01-01
    • 1970-01-01
    • 2011-12-05
    • 2012-12-08
    • 2012-09-16
    • 1970-01-01
    相关资源
    最近更新 更多