Использование 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-контроллер, отображаются в выходных данных, но полученные ссылки не работают. Я должен добавить в коде определенный атрибут href к встроенному элементу "a", чтобы ссылка работала.
Как мне вложить TagHelpers, например LinkTagHelper, в свой собственный TagHelper?
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 mvc), который может быть внедрен в ваш помощник по тегам, который вы можете использовать для создания ссылки.
Однажды IUrlHelper
вводится, вы можете использовать его для создания URL:
UrlHelper.Action(name, controllerName)