在 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
程序集中存在的所有标记助手(使用 *
)。
这给您留下了几个选择:
-
@addTagHelper *, NameOfAssembly
这会注册程序集中的所有标签助手。
-
@addTagHelper FullNameSpace.ActiveClassTagHelper, NameOfAssembly
这仅注册了程序集中的 ActiveClassTagHelper
标记助手。
除非您想选择包含哪些标签助手,否则我推荐选项 1。
我正在尝试使用锚标签助手在 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
程序集中存在的所有标记助手(使用 *
)。
这给您留下了几个选择:
-
@addTagHelper *, NameOfAssembly
这会注册程序集中的所有标签助手。
-
@addTagHelper FullNameSpace.ActiveClassTagHelper, NameOfAssembly
这仅注册了程序集中的
ActiveClassTagHelper
标记助手。
除非您想选择包含哪些标签助手,否则我推荐选项 1。