You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Blazor中MudSelect的onchange/onclick事件无法触发问题求助

MudSelect无法触发DoStuff函数的问题修复

问题根源

  1. 混用@bind-Value和@onchange无效:MudSelect的@bind-Value是语法糖,已经封装了Value绑定和ValueChanged事件逻辑,手动添加原生@onchange不会被触发,组件内部的事件处理会覆盖它。
  2. RowTemplate内嵌套@code块错误:Blazor组件的@code必须放在最外层,你在RowTemplate里写的@code块完全无效,里面定义的DoStuff根本不会被调用,还和外层的同名函数冲突。
  3. Value绑定语法错误:你后来改成的Value="rcontext.Severity"没加@符号,这会把字符串"rcontext.Severity"赋值给组件,而不是绑定到rcontext.Severity变量。
  4. MudSelectItem不需要绑定@onchange:选择项的点击事件由MudSelect统一处理,单独给选项加事件完全多余,也不会生效。

修正后的代码方案

把Severity列的MudSelect改成以下写法,同时移除RowTemplate内的无效@code块,统一在外层@code里定义正确的DoStuff函数:

<MudTd Style="text-align: right" DataLabel="Severity">
    <MudSelect Dense="true" T="string" Label="Severity" Variant="Variant.Filled" 
               Placeholder="Please Select" Required="true"
               @bind-Value="rcontext.Severity" 
               ValueChanged="(value) => DoStuff(rcontext, value)">
        <MudSelectItem Value="@("Acceptable")" />
        <MudSelectItem Value="@("Tolerable")" />
        <MudSelectItem Value="@("Undesirable")" />
        <MudSelectItem Value="@("Intolerable")" />
    </MudSelect>
</MudTd>

然后在外层@code里保留正确的DoStuff函数(删除RowTemplate内的@code块和重复的DoStuff定义):

void DoStuff(Questionnaire context, string selectedString)
{
    context.Severity = selectedString;
    Console.WriteLine("选中的值是: " + selectedString);
}

额外说明

  • 如果不需要传递rcontext,只需要获取选中值,也可以简化成:
    <MudSelect ... @bind-Value="rcontext.Severity" ValueChanged="DoStuff">
    
    对应的函数:
    void DoStuff(string selectedString)
    {
        Console.WriteLine("选中的值是: " + selectedString);
    }
    
  • 确保Questionnaire类的Severity属性是可读写的(有get和set方法),否则绑定和值更新都会失效。

内容的提问来源于stack exchange,提问作者Venkat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 04:26:05