c# - onChange 事件未触发 Blazor InputSelect

标签 c# asp.net-core blazor blazor-server-side

我有以下 InputSelect 代码

               <InputSelect class="form-control form-control form-control-sm"
                             placeholder="Role"
                             disabled="@IsReadOnly"
                             @bind-Value="Model.Role"
                              @onchange="@RoleChanged">
                    <option value="Member">Member</option>
                    <option value="Admin">Admin</option>
                    <option value="Pioner">Pioneer</option>
                    <option value="Retailer">Retailer</option>
                </InputSelect>

对于代码:
bool ShowCreated;
bool ShowUpdated;
bool IsReadOnly;
string SelectedRole;

public EditForm AccountForm;
public Multi.Dtos.RegistrationDto Model = new Dtos.RegistrationDto() { Role = "Member" };

public void RoleChanged(ChangeEventArgs e)
{
    SelectedRole = e.Value.ToString();
    Console.WriteLine(e.Value);
}

当我尝试选择一个新项目时,不会调用 RoleChange 函数。有人可以指出这有什么问题。正确的值已更改,但未调用事件。

最佳答案

笔记:

  • InputSelect 是一个组件元素,而不是 HTML 元素,这就是为什么你不能
    将@onchange 编译器指令应用于它。该指令适用于
    元素,通常但不一定具有 value 属性来形成 so-
    称为双向数据绑定(bind)。
  • @bind-Value 是一个编译器指令指令,指示编译器
    生成支持组件之间双向数据绑定(bind)的代码。申请
    @bind-Value 到 InputSelect 组件需要你(已经在这个
    Blazor 团队的案例)来定义一个名为 Value 的参数属性和一个
    EventCallback 'delegate',通常命名为 ValueChanged。值(value)和
    ValueChanged 是 InputSelect 组件的属性。

  • 有几种方法可以做到这一点:
     <InputSelect ValueExpression="@(()=>comment.Country)" 
                  Value="@comment.Country" 
                  ValueChanged="@((string value) => OnValueChanged(value ))">
            <option value="">Select country...</option>
            <option value="USA">USA</option>
            <option value="Britain">Britain</option>
            <option value="Germany">Germany</option>
            <option value="Israel">Israel</option>
     </InputSelect>
    
    private Task OnValueChanged(string value)
    {
        // Assign the selected value to the Model 
        comment.Country = value;
        return Task.CompletedTask;
    } 
    
    正如 dani herrera 所建议的,您还可以在模型中实现 INotifyPropertyChanged.PropertyChanged 事件。如果您想取消 Forms 组件(包括 EditForm)并使用普通的 HTML 标签,您可以这样做,在这种情况下,您将能够执行以下操作:
    <input type="text" value="@MyValue" @onchange=OnChange"/>
    
    当然,你的模型类会很厚,它应该与 EditContext 通信......
    希望这可以帮助...

    关于c# - onChange 事件未触发 Blazor InputSelect,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61756167/

    相关文章:

    c# - ConverterParameter——有什么方法可以传递一些分隔列表吗?

    C#启动一个静态线程

    asp.net - HttpResponseMessage 不返回 ByteArrayContent - ASP.NET Core

    c# - [Inject] 出现问题,无法在 C# 类 (Blazor) 中工作

    javascript - 如何从 API 填充数据并加载到下拉列表中

    c# - 如何加载相对于 DLL 的附属程序集

    c# - 列出不同用户给定目录的内容,Linux

    c# - Entity Framework Core 3.0 - Include 中使用的 Lambda 表达式无效

    asp.net-core - 无法在 Blazor WASM 中获取 appsettings.json 的值

    c# - 选择选项下拉列表不显示所选选项