使用编辑器模板时不维护 ASP NET 6 Tag Helper 上下文

ASPNET 6 TagHelper context not maintained when using an editor template

给定一些 parent / child 个 TagHelper。

Parent

[HtmlTargetElement("div", Attributes = "parent-context")]
public class AspFormViewTagHelper : TagHelper
{
    [HtmlAttributeName("parent-context")] 
    public string? Prefix { get; set; }

    public override void Init(TagHelperContext context)
    {
        context.Items["parent-context"] = Prefix;
    }
}

Child

[HtmlTargetElement("input", Attributes = "asp-for, child-context")]
public class AspForVueTagHelper : TagHelper
{
    [HtmlAttributeName("asp-for")] public ModelExpression For { get; set; }

    [HtmlAttributeName("child-context")] public String ChildContext { get; set; }

    public override void Process(TagHelperContext context, TagHelperOutput output)
    {
        if (!context.Items.ContainsKey("parent-context"))
            return;
        var prefix = (string) context.Items["parent-context"];
        // The above is null when using an editor template?
    }
}

渲染 HTML 时效果很好。

<div class="tab-pane fade show active" id="person" role="tabpanel" aria-labelledby="home-tab" parent-context="parent">
<div class="row mb-1px">
    <div class="col-md-9">
        <input asp-for="@Model.Person.FirstName" child-context="child" />
    </div>
</div>
</div>

但是,如果我渲染编辑器模板,上下文就会丢失。

<div class="tab-pane fade show active" id="person" role="tabpanel" aria-labelledby="home-tab" parent-context="parent">
    @Html.EditorFor(_ => _.Person.FirstName, "boot-text-child")
</div>

boot-text-child.cshtml 包含这个....

<div class="row mb-1px">
    <div class="col-md-9">
        <input asp-for="@Model" child-context="from-editor-template" />
    </div>
</div>

parent 上下文消失了。
为什么使用编辑器模板时渲染的层次结构会崩溃。有什么方法可以强制渲染,以便为编辑器模板维护上下文。

child 两次都被正确调用,但是当使用编辑器模板时,context.Items 是空的。

这个问题可能与TagHelperContext的范围有关,我这边检查了你的代码,在自定义标签和相关视图页面中设置了一些断点,使用以下代码时似乎:

<div class="tab-pane fade show active" id="person" role="tabpanel" aria-labelledby="home-tab" parent-context="parent">
<div class="row mb-1px">
    <div class="col-md-9">
        <input asp-for="@Model.Person.FirstName" child-context="child" />
    </div>
</div>
</div>

断点顺序为:主页=> AspFormViewTagHelperc.cs => AspForVueTagHelper.cs

但是如果使用编辑器模板和@Html.EditorFor,顺序是:主页=> AspFormViewTagHelperc.cs => 编辑器模板页面=> AspForVueTagHelper.cs.

如果我将 parent div 放入编辑器模板页面,context.Items 包含该值。编辑器模板页面代码如下:

<div class="tab-pane fade show active" id="person" role="tabpanel" aria-labelledby="home-tab" parent-context="parent">
<div class="row mb-1px">
    <div class="col-md-9">
        <input asp-for="@Model" child-context="child" />
    </div>
</div>
</div>

在主页面,只使用Html.EditorFor,像这样:

@Html.EditorFor(_ => _.Person.FirstName, "boot-text-child")

因此,您可以使用此方法渲染元素或直接使用标签助手而不是使用 @Html.EditorFor