在 asp core 中使用 Anchor Tag Helper

Using AnchorTagHelper in aspcore

我正在尝试使用锚标签助手在 aspcore 中实现活动菜单,但它在调试时没有命中代码。

这是我的代码

.cshtml

<li>
  <a asp-area="Admin" is-active asp-controller="p1" asp-action="Index">P1</a>
</li>
<li>
  <a asp-area="Admin" is-active asp-controller="p2" asp-action="Index">P2</a>
</li>
<li>
  <a asp-area="Admin" is-active asp-controller="p3" asp-action="Index">P3</a>
</li>

.cs

namespace Utility.Helper
{
    [HtmlTargetElement(Attributes = "is-active")]
    public class ActiveClassTagHelper : AnchorTagHelper
    {
        public ActiveClassTagHelper(IHtmlGenerator generator)
        : base(generator)
        {
        }

        public override void Process(TagHelperContext context, TagHelperOutput output)
        {
            var routeData = ViewContext.RouteData.Values;
            var currentController = routeData["controller"] as string;
            var currentAction = routeData["action"] as string;
            var result = false;

            if (!string.IsNullOrWhiteSpace(Controller) && !string.IsNullOrWhiteSpace(Action))
            {
                result = string.Equals(Action, currentAction, StringComparison.OrdinalIgnoreCase) &&
                    string.Equals(Controller, currentController, StringComparison.OrdinalIgnoreCase);
            }
            else if (!string.IsNullOrWhiteSpace(Action))
            {
                result = string.Equals(Action, currentAction, StringComparison.OrdinalIgnoreCase);
            }
            else if (!string.IsNullOrWhiteSpace(Controller))
            {
                result = string.Equals(Controller, currentController, StringComparison.OrdinalIgnoreCase);
            }

            if (result)
            {
                var existingClasses = output.Attributes["class"].Value.ToString();
                if (output.Attributes["class"] != null)
                {
                    output.Attributes.Remove(output.Attributes["class"]);
                }

                output.Attributes.Add("class", $"{existingClasses} active");
            }
        }
    }
}

_ViewImports.cshtml

@using WebApp
@using Models
@addTagHelper "*, Microsoft.AspNetCore.Mvc.TagHelpers"
@addTagHelper "*, ActiveClassTagHelper"

我在 ActiveClassTagHelper 中使用断点,但它不起作用。任何建议都会有所帮助。

您示例中的以下行不正确:

@addTagHelper "*, ActiveClassTagHelper"

这会尝试注册 ActiveClassTagHelper 程序集中存在的所有标记助手(使用 *)。

这给您留下了几个选择:

  1. @addTagHelper *, NameOfAssembly
    

    这会注册程序集中的所有标签助手。

  2. @addTagHelper FullNameSpace.ActiveClassTagHelper, NameOfAssembly
    

    这仅注册了程序集中的 ActiveClassTagHelper 标记助手。

除非您想选择包含哪些标签助手,否则我推荐选项 1。