我尝试扩展内置的AnchorTagHelper对象,以自动为生成的URL添加与文化相关的设置。
我的代码:
namespace MyCoreSite.Mvc.TagHelpers
{
[HtmlTargetElement("a")]
public class MyAnchorTagHelper : AnchorTagHelper
{
public MyAnchorTagHelper(IHtmlGenerator generator) : base(generator)
{
}
public override void Process(TagHelperContext context, TagHelperOutput output)
{
var requestCulture = this.ViewContext.HttpContext.Features.Get<IRequestCultureFeature>();
if (context.AllAttributes["asp-route-culture"] == null)
{
this.RouteValues.Add("culture", requestCulture.RequestCulture.UICulture.Name);
}
base.Process(context, output);
output.TagName = "a";
}
}
}
问题是,当我在[HtmlTargetElement(“a”)]属性中使用默认的'a'标记名称时,它会抛出此异常:
System.InvalidOperationException:'无法覆盖'href'属性。具有指定'href'的属性不得具有以'asp-route-'开头的属性或'asp-action','asp-controller','asp-area','asp-route','asp-protocol' ,'asp-host','asp-fragment','asp-page'或'asp-page-handler'属性。'
如果我使用另一个标签名称而不是'a'(例如'aa')它的工作,但我想在我的视图中使用'a'标签。
请帮我解决这个问题!谢谢!
每个标记帮助程序按顺序独立运行,因此除非您完全删除标记帮助程序库(删除在AnchorTagHelper
中引入它的行),否则您无法真正覆盖_ViewImports.cshtml
之类的默认标记帮助程序。否则,这里实际发生的是默认的AchorTagHelper
处理标签,然后您的自定义MyAnchorTagHelper
正在处理已修改的标签。如果依赖于特定属性,那么继承内置标记帮助程序实际上可能会导致问题。
对于您的特定情况,您最好的选择是不继承AnchorTagHelper
,而只需修改href
属性,该属性将从AnchorTagHelper
首先处理标记生成。只需确保您的标记帮助程序库包含在_ViewImports.cshtml
中的默认值之后,因为操作顺序很重要。