Я создал новый проект веб-приложения ASP.NET Core, теперь для простоты скажем, что его корневое пространство имен - это MyWeb.Mvc, которое также является именем сборки, указанным в свойствах проекта.
В том же проекте веб-приложения я создал папку с названием TagHelpers и добавил в нее такой класс:
namespace MyWeb.Mvc.TagHelpers {
public abstract class JsonLdBase : TagHelper
{
protected string addKeyValue(string key, string value, bool noClosing = true)
{
return string.Format("\"{0}\": \"{1}\"{2}{3}", key, value, noClosing ? "," : "", Environment.NewLine);
}
}
public class JsonLdWebsiteTagHelper : JsonLdBase
{
public string Name { get; set; }
public string Alt { get; set; }
public string Url { get; set; }
public override void Process(TagHelperContext context, TagHelperOutput output) {
output.TagName = "script";
output.TagMode = TagMode.StartTagAndEndTag;
output.Attributes.SetAttribute("type", new HtmlString("application/ld+json"));
output.Content.SetContent(
"{" + Environment.NewLine +
addKeyValue("@context", "http://schema.org") +
addKeyValue("@type", "WebSite") +
addKeyValue("name", Name) +
addKeyValue("alternateName", Alt) +
addKeyValue("url", Url) +
"}"
);
}
}
}
Затем в _ViewImports.cshtml у меня есть это:
@using MyWeb.Mvc.TagHelpers
@addTagHelper MyWeb.Mvc.TagHelpers.*, MyWeb.Mvc
А в _Layout.cshtml я использую это так:
<jsonldwebsite name="Panama Vibes" alt="Panama Vibes" url="PanamaVibes.com"/>
Поскольку он был помещен в _Layout.cshtml, он должен отображаться на всех страницах. Но когда я компилирую и запускаю веб-приложение и просматриваю исходный код главной страницы, я вижу, что настраиваемый тег был отображен как обычный тег HTML без обработки TagHelper.
Изначально я думал об использовании пакета NuGet json-ld, но я воздержался, когда увидел, что он не обновлялся с 2016 года и что программист не нашел времени, чтобы задокументировать, как его можно использовать, или привести какие-либо примеры.
ОБНОВЛЕНИЕ №1. Как и было предложено, я явно устанавливаю свойство TagMode. Однако весь вывод становится HTML-кодированным и, следовательно, не проходит проверку JSON + LD.
Теперь я использую HtmlString ("application / json + ld"), и запись типа теперь правильно отображается без кодирования знака "+". Однако я попытался использовать тот же подход для Контента, но там