2016-08-24 14 views
6

内部ヘルパーを何とか反復する(リピータのような)タグヘルパーを作成する方法はありますか?タグヘルパーでループを作成する方法はありますか?

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

私はかみそりのforeachでそれを行うことができます知っているが、私のhtmlでのC#コードに切り替えることなく、それを行う方法を把握しよう:それは、のようなものです。

+0

この投稿には、taghelpers https://blogs.msdn.microsoft.com/webdev/2015/09/02/発表 - 利用可能なasp-net-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> 

と2個のタグヘルパー:

[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>"); 
    } 
} 
関連する問題