使用编辑器模板时不维护 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
。
给定一些 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
。