C# Blazor 按钮(button)的onclick事件没有被触发
在一个Blazor组件(ServerComponent.razor)中,有以下代码:
<button type="button" class="btn btn-primary" @onclick="Change">ChangeStatus</button>
但是在@code部分没有定义Change方法,上面代码也不会报错。如果定义了,那么执行的时候,点击按钮,也没有任何反应。
打开F12,查看网络,点击按钮时没有任何数据,控制台也没有任何报错。
定位该按钮元素,发现为<button type="button" @onclick="Change">ChangeStatus</button>。(正常情况下,应该为:<button type="button">ChangeStatus</button>)。
最后发现,组件所在路径不对。ServerComponent.razor在Controls文件夹中,Controls文件夹与Components文件夹平级,而_Imports.razor文件位于Components文件夹中。

所以,Controls文件夹里面没有_Imports.razor文件,也就没有相关的名称空间,那么ServerComponent.razor中的 @onclick 指令没有被正确识别。
解决办法:
方案一:
在现在的ServerComponent.razor中添加名称空间的引用:
@using Microsoft.AspNetCore.Components.Web
方案二:
把Contols文件夹移入Components文件夹内,使它在_Imports.razor作用域下。
注:要启用 InteractiveServer ,需要3步:
1、在Program.cs 中注册服务:AddInteractiveServerComponents()
builder.Services.AddRazorComponents()
.AddInteractiveServerComponents();
2、在Program.cs 中 启用 InteractiveServer:AddInteractiveServerRenderMode()
app.MapRazorComponents<App>()
.AddInteractiveServerRenderMode();
3、在组件中使用@rendermode 指令。有两种类别
1)组件级别:可以在三个不同的地方指定
a)在组件定义中使用:
@rendermode InteractiveServer
b)在组件实例中使用(推荐这种方式,你可以自由的为每个组件指定不同的交互方式):
<Counter @rendermode="InteractiveServer" />
c)在父组件的定义中使用:
@rendermode InteractiveServer
如果在父组件中指定了@rendermode指令,那么该组件及其所有子组件都将开启交互式。
2)全局级别:
在App.razor中的Routes组件中指定 @rendermode 指令。整个应用程序都将受其影响。
<body>
<Routes @rendermode="InteractiveServer"/>
<script src="_framework/blazor.web.js"></script>
</body>

浙公网安备 33010602011771号