2016-08-24 3 views
6

Есть ли способ создать помощник тега, который каким-то образом выполняет итерацию (например, повторитель) над внутренними помощниками тегов? То есть, что-то вроде:Есть ли способ создать цикл с помощью помощников тегов?

<big-ul iterateover='x'> 
    <little-li value='uses x somehow'></little-li> 
</bg-ul> 

Я знаю, что может сделать это с бритвой Еогеаспом но пытаюсь выяснить, как сделать это без необходимости переключения в C# код в моем HTML.

+0

Я нашел некоторые заметки в этом посте под тегами https://blogs.msdn.microsoft.com/webdev/2015/09/02/ объявляет недоступность-оф-Asp-нетто-5-beta7 / –

ответ

3

Возможно, используя TagHelperContext.Items. От doc:

Получает коллекцию предметов, используемых для связи с другими ITagHelpers. Этот System.Collections.Generic.IDictionary<TKey, TValue> является копией на запись для обеспечения того, что элементы, добавленные в эту коллекцию, видны только другим ITagHelpers, предназначенным для дочерних элементов.

Это означает, что вы можете передавать объекты из вспомогательного родительского тега своим дочерним элементам.

Например, давайте предположим, что вы хотите перебрать список Employee:

public class Employee 
{ 
    public string Name { get; set; } 
    public string LastName { get; set; } 
} 

На ваш взгляд, вы будете использовать (например):

@{ 
    var mylist = new[] 
    { 
     new Employee { Name = "Alexander", LastName = "Grams" }, 
     new Employee { Name = "Sarah", LastName = "Connor" } 
    }; 
} 
<big-ul iterateover="@mylist"> 
    <little-li></little-li> 
</big-ul> 

и два тега помощники:

[HtmlTargetElement("big-ul", Attributes = IterateOverAttr)] 
public class BigULTagHelper : TagHelper 
{ 
    private const string IterateOverAttr = "iterateover"; 

    [HtmlAttributeName(IterateOverAttr)] 
    public IEnumerable<object> IterateOver { get; set; } 

    public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output) 
    { 
     output.TagName = "ul"; 
     output.TagMode = TagMode.StartTagAndEndTag; 

     foreach(var item in IterateOver) 
     { 
      // this is the key line: we pass the list item to the child tag helper 
      context.Items["item"] = item; 
      output.Content.AppendHtml(await output.GetChildContentAsync(false)); 
     } 
    } 
} 

[HtmlTargetElement("little-li")] 
public class LittleLiTagHelper : TagHelper 
{ 
    public override void Process(TagHelperContext context, TagHelperOutput output) 
    { 
     // retrieve the item from the parent tag helper 
     var item = context.Items["item"] as Employee; 

     output.TagName = "li"; 
     output.TagMode = TagMode.StartTagAndEndTag; 

     output.Content.AppendHtml($"<span>{item.Name}</span><span>{item.LastName}</span>"); 
    } 
} 
Смежные вопросы