Именованные помощники тегов в ASP.NET 5 MVC 6

Я создал два десятка помощников HTML, которые я конвертирую в помощников тегов для ASP.NET 5 MVC 6 для создания метатегов Facebook Open Graph. Вот пример типа «веб-сайт»:

Index.cshtml

<open-graph-website title="Page Title" 
                    main-image="new OpenGraphImage(
                        "~/img/open-graph-1200x630.png", 
                        "image/png", 
                        1200, 
                        630)"
                  determiner="Blank"
                  site-name="Site Title">

Каждый тип объекта Open Graph имеет специальное пространство имен, которое необходимо добавить в тег заголовка, например.

_Layout.cshtml

<html>
<head prefix="website: http://ogp.me/ns/website#">
</head>
<body>
    <!-- ...Omitted -->
</body>
</html>

Раньше мне удавалось сделать это с помощью HTML Helpers, используя ViewBag и свойство getter Namespace в классе OpenGraphWebsite следующим образом:

Index.cshtml

ViewBag.OpenGraph = new OpenGraphWebsite(
    "Page Title",
    new OpenGraphImage("/img/open-graph-1200x630.png", "image/png", 1200, 630)
    {
        Determiner = OpenGraphDeterminer.Blank,
        SiteName = "Site Title"
    };

_Layout.cshtml

<html>
<head @(ViewBag.OpenGraph == null ? null : ViewBag.OpenGraph.Namespace)>
    @Html.OpenGraph((OpenGraphMetadata)ViewBag.OpenGraph);
</head>
<body>
    <!-- ...Omitted -->
</body>
</html>

Есть ли способ добиться аналогичного результата с помощью помощников по тегам? Каким образом можно назвать помощник тега или обратиться к нему?


person Muhammad Rehan Saeed    schedule 29.09.2015    source источник
comment
Может быть, здесь вам поможет View Components?   -  person Stafford Williams    schedule 30.09.2015


Ответы (2)


Похоже, этот вопрос обсуждался / отвечал в соответствующей проблеме GitHub.

person N. Taylor Mullen    schedule 01.10.2015

Это ответ на вопрос, который я задал на GitHub. Обратите внимание, что этот помощник тега запускается автоматически, потому что он нацелен только на элемент head.

[TargetElement("open-graph-website", Attributes = nameof(Title) + "," + nameof(MainImage), TagStructure = TagStructure.WithoutEndTag)]
public class OpenGraphWebsiteTagHelper : OpenGraphMetadataTagHelper // Inherits from TagHelper
{
    // ... Omitted
    public override void Process(TagHelperContext context, TagHelperOutput output)
    {
        context.Items[typeof(OpenGraphMetadata)] = this.GetNamespaces();
        output.Content.SetContent(this.ToString());
    }
}

[TargetElement("head")]
public class OpenGraphNamespacePrefixTagHelper : TagHelper
{
     private const string PrefixAttributeName = "prefix";

    public override Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
    {
        context.Items.Add(typeof(OpenGraphMetadata), null);

        await context.GetChildContentAsync();

        string namespaces = context.Items[typeof(OpenGraphMetadata)] as string;
        if (namespaces != null)
        {
            output.Attributes.Add(PrefixAttributeName, namespaces);
        }
    }
}

Я все еще собираюсь поэкспериментировать с добавлением фиктивного обязательного свойства. Это вынудит пользователей отказаться от использования вспомогательной функции тегов, вместо того, чтобы она запускалась автоматически только потому, что они добавили вспомогательную DLL для тегов. Было бы неплохо, если бы в помощники тегов можно было добавить атрибуты без значений, чтобы упростить эту функцию для свойств bool:

<head asp-open-graph-prefix>
Rather than:
<head asp-open-graph-prefix="true">

[TargetElement("head", Attributes = OpenGraphPrefixAttributeName)]
public class OpenGraphNamespacePrefixTagHelper : TagHelper
{
    private const string OpenGraphPrefixAttributeName = "asp-open-graph-prefix";

    [HtmlAttributeName(OpenGraphPrefixAttributeName)]
    public bool DUMMY { get; set; }

    // ..Omitted
}
person Muhammad Rehan Saeed    schedule 02.10.2015