2016-04-25 12 views
2

Ich bin ein einfaches Paginierung TagHelper schreiben, wo ich die Ausgabe wie folgt aussehen wollen:TagHelper

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

hatte ich die Idee, dass meine Klasse bei der Definition I erzeugen würde „a“ Elemente, und schmücken sie mit Asp-Controller, Asp-Aktion usw., Attribute, die als die richtige Href-Link gerendert werden würde. Hier ist der Code, den ich mir ausgedacht habe:

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; 
} 

Aber es funktioniert nicht. Die "MVC magic attributes" wie asp-controller erscheinen in der Ausgabe, aber die resultierenden Links funktionieren nicht. Ich muss dem eingebetteten "a" -Element im Code ein spezifisches href-Attribut hinzufügen, damit die Verbindung funktioniert.

Wie gehe ich bei der Verschachtelung von TagHelpern, wie dem LinkTagHelper, in meinem eigenen benutzerdefinierten TagHelper vor?

+1

Ich bin nicht sicher, können Sie „Nest“ Tag-Helfer wie das wirklich, aber man konnte die Klasse von 'AnchorTagHelper' ableiten und integrieren Sie die generierte Ausgabe der Basis –

Antwort

1

Dieses Video auf Tag-Helfer könnte hilfreich sein: https://channel9.msdn.com/Shows/Web+Camps+TV/Update-on-TagHelpers-with-Taylor-Mullen

bis ca. 35 Minuten Direkt vor in

sie setzen auch den Code bis auf Github. https://github.com/NTaylorMullen/WebCampsTV_TagHelpers1

Der Teil, werden Sie feststellen, relevant ist here:

[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>"); 
      } 
     } 
    } 
} 

Die grundlegenden Voraussetzungen sind, dass Es gibt einen IUrlHelper Service, ich denke, in MVC (asp.net Kern-MVC) integriert, die in Ihre Tag-Helper injiziert werden können, die Sie verwenden können, um die Referenz zu konstruieren.

Sobald die IUrlHelper injiziert Sie es die URL zu konstruieren, verwenden können:

UrlHelper.Action(name, controllerName) 
Verwandte Themen