【问题标题】:How do I access the code block within a Blazor RenderFragment?如何访问 Blazor RenderFragment 中的代码块?
【发布时间】:2023-03-28 07:05:01
【问题描述】:

我是编程、C# Blazor 和 RenderFragments 的新手,如果这是一个基本问题,请见谅。

我需要设置一个选项卡式对话框界面,其中根据单击的菜单按钮显示不同的选项卡。我设置了一个显示为按钮的 DevExpress 菜单项:

<DxMenuItem Text="States" IconCssClass="homeMenuButtonStates" CssClass="menuItemSm" Click="OnStatesBrowseClick" />

当用户点击时,调用 OnStatesBrowseClick 函数:

    public void OnStatesBrowseClick()
    {
        tabName[tdiIndex] = "States";
        TdiNewTab(tabName[tdiIndex]);
    }

如您所见,它的工作是为字符串数组的成员赋值(tdiIndex 被赋值为“0”),并使用参数 tabName[tdiIndex] 调用 TdiNewTab 方法,其计算结果为“States”。

TdiNewTab 有一个 switch 语句,目前只有“状态”的情况。

    public void TdiNewTab(string switchTabName) {
    switch (switchTabName)
    {
        case "States":
            renderStatesBrowsePage(tdiIndex);
            break;
    }
    tdiIndex++;
}

如果出现“States”,它会指向应创建选项卡的 renderStatesBrowsePage。

    private RenderFragment renderStatesBrowsePage(int index)
{
    deleteMe++;
    RenderFragment item = tabsChildContent =>
    {
        deleteMe++;
        tabsChildContent.OpenComponent<DxTabPage>(0);
        tabsChildContent.AddAttribute(2, "Text", $"Tab # {index}");
        tabsChildContent.AddAttribute(3, "ChildContent", (RenderFragment)((tabPageChildContent) =>
        {
            tabPageChildContent.OpenComponent<States>(0);
            tabPageChildContent.CloseComponent();
        }));
        tabsChildContent.CloseComponent();
    };
    return item;
}

但是,什么也没有发生。使用断点,我确定“RenderFragment item = tabsChildContent =>”中的块没有被执行。事实上,当我把两个“deleteMe++”都放在那里时,只有第一个增加了变量。

我不知道为什么该块不会执行。任何建议将不胜感激!

回应Magoo先生的回答:

我现在正尝试从我的标记中调用 RenderFragment:

<DxMenuItem Text="States" IconCssClass="homeMenuButtonStates" CssClass="menuItemSm" Click="StatesBrowseClick">
@if (statesBrowse == 1)
{
    @renderStatesBrowsePage(0);
}
</DxMenuItem>

@code
        public void StatesBrowseClick()
        {
        int statesBrowse = 1;
        }

但是,仍然没有任何反应。我确保在方法之外初始化为“0”的 statesBrowse 在单击后等于 1。我还尝试删除 @if 语句(只留下“@renderStatesBrowsePage(0);”,我得到了相同的结果。

注意:我使用的是 VS 2019,在 StatesBrowseClick 中,它告诉我“变量 'statesBrowse' 已分配,但它的值从未使用过。”不过,这似乎无关紧要,因为我尝试手动将其设置为“1”并删除“if”语句。

【问题讨论】:

    标签: c# blazor


    【解决方案1】:

    该块不会执行,因为没有任何东西在执行它。

    renderStatesBrowsePage 返回一个需要渲染的 RenderFragment - 但您在此处将其丢弃:

    public void TdiNewTab(string switchTabName) {
        switch (switchTabName)
        {
            case "States":
                // This returns a RenderFragment but you are discarding it 
                renderStatesBrowsePage(tdiIndex); 
                break;
        }
        tdiIndex++;
    }
    

    如果不查看更多项目,很难告诉您应该做什么,但通常会通过将 RenderFragment 添加到组件标记来呈现它

    <div>some stuff</div>
    <div>
    @MyRenderFragment
    </div>
    

    【讨论】:

    • 谢谢@MisterMagoo。刚刚更新了包含后续详细信息的问题。
    • 是对的。我在 DxTabs 标记之间的 for 循环中插入了渲染片段,它起作用了。
    猜你喜欢
    • 2021-07-11
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    • 2021-11-09
    • 1970-01-01
    • 2020-09-16
    • 2020-01-10
    • 2020-06-18
    相关资源
    最近更新 更多