从 Blazor 中生成的按钮调用函数

Calling function from generated button in Blazor

我目前正在尝试从一些自动生成的按钮调用方法,这些按钮是根据某些配置设置的。所以按钮的数量是可配置的。我有如下所示的 blazor 页面。我的问题是,如果我有 3 个按钮并且我按下一个按钮,则 ButtonClicked 被正确调用,但索引始终为 3 - for 语句的 int i 的结束值。我当然希望将按钮的索引传递给函数。一个明显的解决方案是在我自己的组件中包装一个按钮,然后采用一个索引参数,这可以传递给 buttonclicked 事件,但是我如何在不制作我自己的按钮组件的情况下使下面的代码工作?

@inject Navigator navigator

<div class="chooseDiv">
    @for (int i = 0; i < Buttons.Count; i++)
    {
        <button type="button" class="btn btn-primary btn-lg" style="margin:10px" onclick="@((ui) => ButtonClicked(i))">@Buttons[i]</button>
    }
</div>

@functions {
    [Parameter] List<string> Buttons { get; set; } = new List<string>() { "You forgot to declare your buttons" };

    private void ButtonClicked(int index)
    {
        Console.WriteLine("Button clicked with index:" + index);
        navigator.CurrentResult = index;
        navigator.Next();
    }
}

我猜你应该像下面这样在你的循环中添加一个局部变量:

@for (int i = 0; i < Buttons.Count; i++)
    {
        var local = i;
        <button type="button" class="btn btn-primary btn-lg" style="margin:10px" onclick="@((ui) => ButtonClicked(local))">@Buttons[i]</button>
    }

这是标准的 C# 行为,与 Blazor 无关,其中 lambda 表达式 @((ui) => ButtonClicked(i)) 可以访问变量而不是其值。您必须定义一个局部于循环的变量,否则您的 lambda 表达式总是调用 ButtonClicked(i) 并且在循环结束时 i 等于 3。

希望这对您有所帮助...