在ASP Net.Core 2.2中使用自动属性扩展AnchorTagHelper

问题描述 投票:0回答:1

我尝试扩展内置的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'标签。

请帮我解决这个问题!谢谢!

c# asp.net asp.net-core-2.2 asp.net-core-tag-helpers
1个回答
1
投票

每个标记帮助程序按顺序独立运行,因此除非您完全删除标记帮助程序库(删除在AnchorTagHelper中引入它的行),否则您无法真正覆盖_ViewImports.cshtml之类的默认标记帮助程序。否则,这里实际发生的是默认的AchorTagHelper处理标签,然后您的自定义MyAnchorTagHelper正在处理已修改的标签。如果依赖于特定属性,那么继承内置标记帮助程序实际上可能会导致问题。

对于您的特定情况,您最好的选择是不继承AnchorTagHelper,而只需修改href属性,该属性将从AnchorTagHelper首先处理标记生成。只需确保您的标记帮助程序库包含在_ViewImports.cshtml中的默认值之后,因为操作顺序很重要。

© www.soinside.com 2019 - 2024. All rights reserved.