Blazor 教程:@onclick事件在新的 Razor 组件中不起作用

Blazor tutorial: @onclick event doesn't work in new razor components

提问人:Gautzilla 提问时间:11/16/2023 最后编辑:Gautzilla 更新时间:11/19/2023 访问量:73

问:

我是 Blazor 的新手,我正在遵循 blazor-workshop 教程。

我使用的是 .NET 版本 8.0.100

我使用计数器组件创建了示例项目,并对其进行了一些操作,并且我测试的所有内容都正常工作(例如,由于for循环,显示与计数器值相对应的表情符号,诸如此类基本的东西)。

我进入了下一步,练习如何构建待办事项列表

我按照指南一步一步地操作,拥有完全相同的代码(步骤4),但是单击“添加待办事项”按钮不会执行任何操作。

我的组件:Todo.razor

@page "/todo"

<h3>Todo</h3>

<ul>
    @foreach(var todo in todos)
    {
        <li>@todo.Title</li>
    }
</ul>

<input placeholder="Something to do" @bind="newTodo" />
<button @onclick="AddTodo">Add</button>

@code {
    private List<TodoItem> todos = new();
    private string? newTodo;

    private void AddTodo()
    {
        if (!string.IsNullOrWhiteSpace(newTodo))
        {
            todos.Add(new TodoItem{Title = newTodo});
            newTodo = string.Empty;
        }
    }
}

我尝试在 VS Code 中调试它:我在“AddTodo()”方法的开头添加了一个断点,结果发现当我单击按钮时没有到达该方法。

我尝试将“Counter.razor”组件的内容(在创建新的 blazor 项目时创建)替换为“Todo.razor”组件的内容,这里一切正常:当我单击按钮时,项目会添加到列表中。

有谁知道我在这里做错了什么?

谢谢!!

编辑:我缺少组件顶部的那一行。这就解决了问题!但我不认为将 H H 的答案标记为正确的绿色标记。@rendermode InteractiveServer

Razor Blazor Net-8.0

评论

0赞 RBee 11/16/2023
什么 .NET 版本?
0赞 Kurt Hamilton 11/16/2023
你能在 blazorfiddle.com 重现问题吗?你能提供一些代码示例来帮助其他人看到你哪里出错了吗?
0赞 Gautzilla 11/16/2023
我使用的是 .NET 版本 8.0.100。实际上,问题与 blazorfiddle 中的“Todo”示例完全相同:Todo
2赞 ℍ ℍ 11/16/2023
那个车间很旧。您现在需要设置交互性(渲染)模式。没有代码并知道哪个入门模板,就不可能有具体的答案。
0赞 Gautzilla 11/16/2023
好的,谢谢!我使用 然后,我添加了一个组件(我将编辑放置组件代码的答案)和指向导航菜单中的 Todo 页面的链接。我真的没有添加任何其他内容!dotnet new blazor -o BlazorAppTodo.razor

答:

1赞 RBee 11/16/2023 #1

从 .NET 8 开始,他们引入了渲染模式 MS 文档

这是一项需要学习并主动合并到交互式组件的 .NET 8 Blazor 项目中的功能。 为了在组件中启用交互性,每个组件都需要在本地或全局声明。@rendermode

但是,如果您想遵循该教程,我建议您使用其设计的版本进行学习。下面介绍如何使用 CLI 创建 .NET 版本为 <= 7 的 Blazor 应用。

//server side Blazor
dotnet new blazorserver -f net7.0 -o BlazorApp

//client side Blazor
dotnet new blazorwasm -f net7.0 -o BlazorApp

评论

1赞 kah608 11/19/2023
仅供参考,对于那些遇到这种情况并使用 net8 的人 - 如果您将@rendermode添加到您的 Todo.razor 中,这也将修复它。@page “/todo” @rendermode InteractiveServer'