Asp.NET Core 自定义输入标记帮助器渲染重复复选框

dhe*_*n79 6 c# tag-helpers asp.net-core

我创建了一个继承自 InputTagHelper 的标签助手,如这篇文章/sf/answers/2834275811/中的答案所示。

这是代码

[HtmlTargetElement("input", Attributes = ForAttributeName)]
public class ExrInputTagHelper : InputTagHelper
{
    private const string ForAttributeName = "asp-for";

    [HtmlAttributeName("asp-disabled")]
    public bool IsDisabled { get; set; }

    public ExrInputTagHelper(IHtmlGenerator generator):base(generator) 
    {

    }

    public override void Process(TagHelperContext context, TagHelperOutput output)
    {
        if (IsDisabled)
        {
            var d = new TagHelperAttribute("disabled", "disabled");
            output.Attributes.Add(d);
        }
        base.Process(context, output);
    }
}
Run Code Online (Sandbox Code Playgroud)

这是它的用法:

<input asp-for="UsingCreditCard" type="checkbox" asp-disabled="@Model.UsingACH" />
Run Code Online (Sandbox Code Playgroud)

这很有效,但有一个明显的问题。如果输入类型是复选框,则会呈现两次。所有其他输入类型都很好用。为什么会出现这种情况呢?

<input checked="checked" data-val="true" data-val-required="The UsingCreditCard field is required." id="UsingCreditCard" name="UsingCreditCard" type="checkbox" value="true">
<input checked="checked" id="UsingCreditCard" name="UsingCreditCard" type="checkbox" value="true">
Run Code Online (Sandbox Code Playgroud)

任何想法都将不胜感激。

提前致谢。

Ash*_*Lee 7

在 中_ViewImports.cshtml,添加@removeTagHelper行。您正在添加一个新的InputTagHelper,它实现了旧的InputTagHelper 的所有功能,并且两者都被调用。

@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@removeTagHelper Microsoft.AspNetCore.Mvc.TagHelpers.InputTagHelper, Microsoft.AspNetCore.Mvc.TagHelpers
@addTagHelper *, AspNetCoreExample  // your assembly name
Run Code Online (Sandbox Code Playgroud)

InputTagHelper.cs中,“checkbox”的实现方式与所有其他输入类型不同;它为“复选框”创建 2 个输入字段(复选框和支持隐藏字段)。由于它以不同的方式创建它,因此它不会合并属性以避免重复,而是再次创建它们。