Как написать собственный помощник по тегам ASP.NET 5, который содержит другие помощники по тегам

Я просматривал примеры taghelpers в Google, но не смог найти ни одного нужного примера.

У меня есть следующий код:

<div class="form-group">
    <label asp-for="PersonName" class="col-md-2 control-label"></label>
    <div class="col-md-10">
        <input asp-for="PersonName" class="form-control" />
        <span asp-validation-for="PersonName" class="text-danger"></span>
    </div>
</div>

Я бы хотел заменить его чем-то вроде

<bootstraprow asp-for="PersonName"></bootstraprow>

Однако я не уверен, что буду писать помощник по тегам, содержащий другие помощники по тегам.

  1. Является ли это возможным?
  2. Если возможно, предоставьте пример кода для вышеуказанного

Изменить: это не то же самое, что хранить переменные в пользовательских taghelpers, но я хочу вызвать другие пользовательские taghelpers или существующие taghelpers.


person zoaz    schedule 11.11.2015    source источник
comment
Возможный дубликат вложения TagHelpers в ASP.NET 5 MVC 6   -  person Daniel J.G.    schedule 11.11.2015
comment
Не дубликат. Возможный дубликат упоминает только о вложенности TagHelpers. Это о том, как TagHelper генерирует разметку, которая будет обрабатываться другим TagHelper. Что на данный момент невозможно.   -  person Maxime Rouiller    schedule 11.11.2015
comment
Вы спрашиваете, можете ли вы написать хелперы тегов, которые содержат другие хелперы тегов, и если да, приведите пример. На мой взгляд, связанный вопрос охватывает оба.   -  person Daniel J.G.    schedule 14.11.2015


Ответы (1)


Если мы проверим, что у вас есть, единственное свойство, которое вы используете, — это PersonName. Что касается самой разметки, то все остальное — старый добрый HTML.

Так что ничего заменять не нужно. Что вам нужно, так это иметь конструктор, который зависит от IHtmlGenerator. Это будет автоматически введено, и вы сможете генерировать различные теги на основе вашей модели.

Соответствующая IHtmlGenerator подпись:

public interface IHtmlGenerator
{
    ...

    TagBuilder GenerateValidationMessage(
        ViewContext viewContext,
        string expression,
        string message,
        string tag,
        object htmlAttributes);
    TagBuilder GenerateLabel(
        ViewContext viewContext,
        ModelExplorer modelExplorer,
        string expression,
        string labelText,
        object htmlAttributes);
    TagBuilder GenerateTextBox(
        ViewContext viewContext,
        ModelExplorer modelExplorer,
        string expression,
        object value,
        string format,
        object htmlAttributes);
    ...
}

И это все!

Вот немного кода, который зафиксирует базовый тег:

[HtmlTargetElement("bootstraprow")]
public BootstrapRowTagHelper: TagHelper
{
    protected IHtmlGenerator Generator { get; set; }
    public InputTagHelper(IHtmlGenerator generator)
    {
        Generator = generator;
    }

    [HtmlAttributeName("asp-for")]
    public ModelExpression For { get; set; }

    [HtmlAttributeNotBound]
    [ViewContext]
    public ViewContext ViewContext { get; set; }

    public override void Process(TagHelperContext context, TagHelperOutput output)
    {
        //todo: write your html generating code here.
    }
}

Вот репозиторий с примером кода, который генерирует Bootstrap HTML из TagHelpers:

https://github.com/dpaquette/TagHelperSamples/blob/master/TagHelperSamples/src/TagHelperSamples.Bootstrap/

person Maxime Rouiller    schedule 11.11.2015
comment
Можете ли вы предоставить код для ссылки на вышеизложенное в cshtml? - person zoaz; 12.11.2015