Использование TagHelper в Custom TagHelper

Я пишу простую разбивку на страницы TagHelper, где я хочу, чтобы результат выглядел так:

<ul>
    <li><a href="...">Some Text</a></li>
    <li><a href="...">Some Other Text</a></li>
    ...
</ul>

У меня была идея, что при определении моего класса я сгенерирую элементы «a» и украсью их атрибутами asp-controller, asp-action и т. Д., Которые будут отображаться как правильная ссылка href. Вот код, который я придумал:

protected TagBuilder CreatePageLink( int page, bool enabled, string inner )
{
    TagBuilder a = new TagBuilder( "a" );

    a.MergeAttribute( "asp-controller", AspController );
    a.MergeAttribute( "asp-action", AspAction );
    a.MergeAttribute( "asp-route-page", page.ToString() );
    a.MergeAttribute( "asp-route-itemsPerPage", ItemsPerPage.ToString() );

    a.MergeAttribute( "title", $"goto page {page}" );

    if( !enabled ) a.AddCssClass( "disabled" );
    if( (page == Page) && String.IsNullOrEmpty(inner) ) a.AddCssClass( "active" );

    if( String.IsNullOrEmpty( inner ) ) inner = page.ToString();
    a.InnerHtml.AppendHtml( inner );

    TagBuilder li = new TagBuilder( "li" );
    li.InnerHtml.Append( a );

    return li;
}

Но это не работает. «Магические атрибуты MVC», такие как asp-controller, отображаются в выходных данных, но результирующие ссылки не работают. Я должен добавить в коде специальный атрибут href к встроенному элементу «a», чтобы ссылка работала.

Как мне вложить TagHelpers, например LinkTagHelper, в мой собственный TagHelper?


person Mark Olbert    schedule 25.04.2016    source источник
comment
Я не уверен, что вы действительно можете вкладывать такие помощники тегов, но вы можете унаследовать свой класс от AnchorTagHelper и интегрировать сгенерированный базой вывод   -  person lc.    schedule 25.04.2016


Ответы (1)


Это видео о помощниках тегов может быть полезно: https://channel9.msdn.com/Shows/Web+Camps+TV/Update-on-TagHelpers-with-Taylor-Mullen

Переходите к примерно 35 минутам.

Также они разместили код на github: https://github.com/NTaylorMullen/WebCampsTV_TagHelpers1

Часть, которая будет вам интересна, находится здесь:

[OutputElementHint("ul")]
public class ControllerNavigationTagHelper : TagHelper
{
    public ControllerNavigationTagHelper(IUrlHelper urlHelper)
    {
        UrlHelper = urlHelper;
    }

    private IUrlHelper UrlHelper { get; }

    public Type ControllerType { get; set; }

    public string Exclude { get; set; }

    public override void Process(TagHelperContext context, TagHelperOutput output)
    {
        output.TagName = "ul";

        var actionNames = ControllerType.GetTypeInfo().DeclaredMethods
            .Where(methodInfo => methodInfo.IsPublic)
            .Select(methodInfo => methodInfo.Name);

        var controllerName = ControllerType.Name;

        if (controllerName.EndsWith("Controller", StringComparison.OrdinalIgnoreCase))
        {
            controllerName = controllerName.Substring(0, controllerName.Length - "Controller".Length);
        }

        foreach (var name in actionNames)
        {
            if (!string.Equals(name, Exclude, StringComparison.OrdinalIgnoreCase))
            {
                var displayName =
                    string.Equals(name, "Index", StringComparison.OrdinalIgnoreCase) ? controllerName : name;
                output.PostContent.Append($"<li><a href='{UrlHelper.Action(name, controllerName)}'>{displayName}</a></li>");
            }
        }
    }
}

Основная предпосылка состоит в том, что существует служба IUrlHelper, я думаю, встроенная в mvc (asp.net core mvc), которая может быть вставлена ​​в ваш помощник по тегам, который вы можете использовать для создания ссылки.

После того, как IUrlHelper введен, вы можете использовать его для создания URL-адреса:

UrlHelper.Action(name, controllerName)
person Alexander Lindsay    schedule 26.04.2016