2016-04-25 74 views
2

我正在写一个简单的分页TagHelper,在这里我所要的输出是这样的:在自定义使用TagHelper TagHelper

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

我有想法,在我的定义I类会产生“一”元素,并用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; 
} 

但它不起作用。输出中显示了像asp-controller这样的“MVC魔术属性”,但生成的链接不起作用。我必须在代码中添加一个特定的href属性给嵌入的“a”元素以使链接工作。

如何在我自己的自定义TagHelper中嵌套TagHelpers,如LinkTagHelper?

+1

我不知道你能真正“鸟巢”的标签助手这样的,但你可以从'AnchorTagHelper'派生类并整合基地的生成输出 –

回答

1

上标记助手这段视频可能会有所帮助:https://channel9.msdn.com/Shows/Web+Camps+TV/Update-on-TagHelpers-with-Taylor-Mullen

直接跳到约35分钟

此外,他们把代码了在GitHub上:https://github.com/NTaylorMullen/WebCampsTV_TagHelpers1

的部分,你会发现相关的是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>"); 
      } 
     } 
    } 
} 

的基本前提是,有一个IUrlHelper服务,我认为内置于mvc(asp.net核心mvc),可以注入到您的标签助手中,您可以使用它来构建引用。

一旦IUrlHelper注入你可以用它来构造URL:

UrlHelper.Action(name, controllerName) 
相关问题