2017-05-29 114 views
0

我正在嘗試使用TagHelper s來重寫我網站上的一些meta標籤。TagHelper for <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屬性:它指向的URL在CDN上而不是本地文件。

我做了一個自定義的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標籤是什麼,所以我不知道問題出在哪裏。有什麼建議麼?

回答

1

好吧,我覺得真的很愚蠢沒有檢查這之前我張貼的問題,但apparantly,它是輸入這是搞亂了TagHelper起來。

它說Tag helpers must have a start and end tag or be self closing. Apparantly,這意味着附帶的meta元件必須具有一個結束標記或可自閉合,這(如圖我的前/後的樣品)我meta元件沒有。

所以解決的,我根本就使輸入meta標籤自我關閉(即收盤>前添加/):

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

嗯,是不是應該是一個正斜槓'/ '? – juunas

+0

@juunas你是對的,編輯。謝謝! – nbokmans

+0

如果您希望TagHelper允許它爲非自閉合,您還可以指定TagStructure爲TagStructure.WithoutEndTag。例如:https://github.com/aspnet/Mvc/blob/dev/src/Microsoft.AspNetCore.Mvc.TagHelpers/InputTagHelper.cs#L18 –