我有一个TagHelper,它在Init
方法中创建了一个上下文:
public class TabContext
{
public bool HasExplicitActiveItem { get; set; }
public bool HasActiveItem { get; set; }
}
在孩子Taghelper中,如果此taghelper的Html属性(HasExplicitActiveItem
)设置为bool IsActive
,我正尝试设置true
:
public override void Init(TagHelperContext context)
{
//...
if (IsActive)
{
_tabContext.HasExplicitActiveItem = true;
}
}
现在,当taghelpers被初始化并且HasExplicitActiveItem
不成立时,我想从第一个子标记器设置IsActive
状态:
public override void Process(TagHelperContext context, TagHelperOutput output)
{
//...
if (_tabContext.HasActiveItem)
{
IsActive = false;
}
else if (!_tabContext.HasExplicitActiveItem)
{
IsActive = true;
}
if (IsActive)
{
_tabContext.HasActiveItem = true;
}
//...
}
但是,这不起作用,因为在初始化下一个子标记帮助程序之前,会初始化并处理每个子标记帮助程序。
要调用它们,我使用父标记帮助程序中的await output.GetChildContentAsync()
。
那么可以首先初始化所有(直接)孩子,然后处理它吗?如果没有,有没有办法预先扫描儿童的属性?
有疑问,我有一个XY问题,所需的标记是这样的:
<tab>
<tab-pane />
<tab-pane />
<tab-pane is-active="true" />
<tab-pane />
</tab>
如果未设置is-active
,我想在第一个is-active
上设置tab-pane
。
答案 0 :(得分:0)
我没有从孩子那里输出任何东西来解决这个问题。
我已将任何子数据映射到项目上下文中:
public class TabPaneContext
{
public IHtmlContent Content { get; set; }
public string Id { get; set; }
public bool IsActive { get; set; }
public string Title { get; set; }
}
主要的Context只获取Item Context的List:
public class TabContext
{
public IList<TabPaneContext> Items { get; set; }
}
儿童Taghelper将实际内容保存到项目上下文中:
public class TabPaneTagHelper : TagHelper
{
private TabContext _tabContext;
private TabPaneContext _tabPaneContext = new TabPaneContext();
public string Id
{
get => _tabPaneContext.Id;
set => _tabPaneContext.Id = value;
}
public bool IsActive
{
get => _tabPaneContext.IsActive;
set => _tabPaneContext.IsActive = value;
}
public string Title
{
get => _tabPaneContext.Title;
set => _tabPaneContext.Title = value;
}
public override void Init(TagHelperContext context)
{
_tabContext = context.Items[typeof(TabContext)];
_tabContext.Items.Add(_tabPaneContext);
}
public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
{
_tabPaneContext.Content = await output.GetChildContentAsync();
output.SuppressOutput();
}
输出的实际生成由主标记器通过迭代项目来完成。
不确定效率如何,但它确实有效。还是觉得有点脏。