是否可以在处理之前初始化所有Taghelpers?

时间:2018-03-07 04:13:14

标签: c# asp.net-core asp.net-core-tag-helpers

我有一个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

1 个答案:

答案 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();
    }

输出的实际生成由主标记器通过迭代项目来完成。

不确定效率如何,但它确实有效。还是觉得有点脏。