給定一些父/子 TagHelper(s)。
家長
[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;
}
}
孩子
[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>
父背景關系消失了。
為什么使用編輯器模板時渲染的層次結構會崩潰。有沒有辦法強制渲染,以便為編輯器模板維護背景關系。
兩次都正確呼叫了孩子,但是當使用編輯器模板時,它context.Items是空的。
uj5u.com熱心網友回復:
該問題可能與 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>
斷點順序為:Main page => AspFormViewTagHelperc.cs => AspForVueTagHelper.cs
但如果使用 Editor Template 和@Html.EditorFor,則順序為:Main page => AspFormViewTagHelperc.cs => Editor Template page => AspForVueTagHelper.cs。
如果我將parentdiv 放入編輯器模板頁面,則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.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/440811.html
