如何在 Blazor 组件上进行双向绑定

2023-11-24

我想创建自定义输入,所以我创建了这个组件:

MyInputComponent.razor:

<div>
  <input type="text" @bind="BindingValue" />
</div>

@code {
    [Parameter]
    public string BindingValue { get; set; }
}

然后是用法:

<EditForm Model="model" OnValidSubmit="Submit">
    <MyInputComponent BindingValue="model.Name" />
</EditForm>

@code {
    User model = new User() { Name = "My Name" };

    private void Submit()
    {
       // here I found model.Name = null;
   }
}

当我调试时MyInputComponent,我找到了我输入的值。但是当我提交表单时,该值为空。

缺什么?


快速回答

Quoting Blazor 文档:

元件参数

绑定识别组件参数,其中@bind-{property}可以跨组件绑定属性值。

对于您的页面:

<EditForm Model="model" OnValidSubmit="Submit">
    <MyInputComponent @bind-BindingValue="model.Name" />
</EditForm>

子组件MyInputComponent:

<div>
  <InputText type="text" @bind-Value="@BindingValue" />
</div>

@code {

    private string _value;

    [Parameter]
    public string BindingValue
    {
        get => _value;
        set
        {
            if (_value == value ) return;
            _value = value;
            BindingValueChanged.InvokeAsync(value);
        }
    }

    [Parameter]
    public EventCallback<string> BindingValueChanged { get; set; }   

}

Notice

  • 您应该通过以下方式引发子组件的绑定更改EventCallback<string> BindingValueChanged.
  • I chose BindingValue and BindingValueChanged作为标识符,但是,您可以只使用Value and ValueChanged。那么将会是:<MyInputComponent @bind-Value="model.Name" />

在 BlazorFiddle 尝试一下.

(2022 年编辑)完整记录现在位于:与组件参数绑定

已编辑:请参阅下面的选项 2 以获取干净的解决方案:


您在 EditForm 内的控件

如果您想将组件放入 EditForm 并处理验证,或使用 onchange 事件执行其他操作,您应该引发EditContext.NotifyFieldChanged。您有两种选择。

选项 1:从 EditContext 引发

你可以得到EditContext from CascadeParameter并调用NotifyFieldChanged用手:

    [CascadingParameter] EditContext EditContext { get; set; } = default!;
    [Parameter] public Expression<Func<string>>? ValueExpression { get; set; }
    #endregion

    #region bindedValue
    [Parameter] public EventCallback<string> ValueChanged { get; set; }
    private string _value { set; get; } = "";
    [Parameter]
    public string Value
    {
        get => _value;
        set
        {
            if (_value == value) return;
            _value = value;
            ValueChanged.InvokeAsync(value);
            var fieldIdentifier = FieldIdentifier.Create(ValueExpression);
            EditContext.NotifyFieldChanged(fieldIdentifier);

        }
    }

选项2(推荐):通过从InputBase继承

你可以继承自InputBase<string>并执行TryParseValueFromString. InputBase将为您做这项工作,当您继承时InputBase你有Value, ValueChanged, EditContext, etc.

protected override bool TryParseValueFromString(string? value, out string result, [NotNullWhen(false)] out string? validationErrorMessage)
{
    result = value ?? "";
    validationErrorMessage = null;
    return true;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Blazor 组件上进行双向绑定 的相关文章

随机推荐

  • ReSharper 6.1 是否可以与 Visual Studio 2012 配合使用?

    Resharper 6 1 支持 Visual Studio 2012 吗 我可以在 VS2010 上使用它 但想知道我是否需要升级到 ReSharper 7 0 以获得 VS2012 的支持 如果我这么做的话 我会很失望 捷脑公司承认虽然
  • bootstrap 3 到 bootstrap 4 列不再水平对齐[重复]

    这个问题在这里已经有答案了 我正在迁移到 bootstrap 4 但是我已将页面的 bootstrap min css 从 3 交换到 4 并且我的列现在全部垂直对齐 据我所知 列是正确的 我还使用 JS 小提琴进行测试 并且能够将它们全部
  • 对模板中的对象进行排序

    让这些模型 class Category models Model name models CharField max length 20 class Word models Model name models CharField max
  • R 使用 XML 数据时出现“externalptr”错误

    我正在 R 中处理一些 XML 数据 并遇到了有关 externalptr 类型的错误 1 当我尝试使用 xmlInternalTreeParse 函数 XML 包的一部分 时 出现以下错误 doc xmlInternalTreeParse
  • Magento:以编程方式添加新产品

    我正在尝试以编程方式将产品添加到 Magento 1 5 我的脚本最终将是一个 cron 作业 按照帐户系统提供的 XML 文件的指示定期更新和添加产品 我在创造新产品时遇到问题 我的脚本中的相关代码段是 attributeSetId 4
  • 将数组写入范围。只获取数组的第一个值

    我正在尝试将数组写入一个范围 并且尝试了多种方法 但无论如何 我总是一遍又一遍地只获得数组的第一个值 这是代码 Option Explicit Sub test ActiveWorkbook Worksheets Sheet1 Cells
  • 密集和稀疏矩阵的高效(时间和空间复杂度)数据结构

    我必须读取一个文件 其中存储了一个包含汽车的矩阵 1 蓝色汽车 2 红色汽车 0 空车 我需要编写一个算法来移动汽车矩阵的这种方式 蓝色的会动downward 红色的移动向右 有一个turn其中所有蓝色的都移动 然后轮流移动所有红色的 在读
  • Python:找到最小元素的最后一个索引?

    例如 1 2 3 4 1 2 具有最小元素 1 但它最后一次出现在索引 4 处 gt gt gt values 1 2 3 4 1 2 gt gt gt min x i for i x in enumerate values 1 4 无需修
  • 使用 OR 运算符检查变量值

    因此 我团队中的一位初级程序员今天编写了以下代码 if status incomplete unknown 这显然不会达到他的预期 即 if status incomplete status unknown 但我无法解释的是为什么第一段代码
  • 具有单一方法的类——最好的方法?

    假设我有一个旨在执行单个功能的类 执行完该功能后 就可以将其销毁 有什么理由选择其中一种方法吗 Initialize arguments in constructor MyClass myObject new MyClass arg1 ar
  • 在存档中安装 R 包

    如何在 Windows 中安装存档的软件包 http cran r project org src contrib Archive 当我尝试安装从存档下载的 tar gz 时 出现以下错误 Error in gzfile file r ca
  • Firestore 安全规则中的递归通配符未按预期工作

    我有一个像这样的数据结构 收藏 and 文件而不是JSON当然 但你明白了 users user1 name Alice groups groupA subbed true groupB subbed true user2 name Bob
  • Valums 文件上传器在 Internet Explorer 9 下不起作用

    Values 文件上传器 现在称为精美上传者 在 Internet Explorer 9 下不起作用 但在 Chrome 下工作得很好 因此 在 IE 下 它会显示文件名和取消按钮 并且不会显示上传百分比 有什么线索吗 更新 解决方案也在这
  • 从网络中的另一台机器 Ping Docker 容器

    我创建了一个 docker 容器 并尝试在容器的 bash 中 ping www google com 并且它有效 我还尝试从主机 ping 容器 它工作得很好 但是 当我尝试从网络中的外部系统 ping 容器时 它给了我一个请求超时异常
  • CakePHP 从数据库中查询最近的纬度经度

    在 CakePHP v3 应用程序中 如何根据传递的 lat lng 值检索最接近的结果 我想让它们恢复为原生 CakePHP 实体 所以像这样 public function closest lat lng sightings recor
  • 我应该将时区与 Postgres 和 JDBC 的时间戳分开存储吗?

    看起来 也许我是错的 如果你想保留 JDBC 和 Postgres 发生问题时的时区 你需要将时区与时间戳分开存储 也就是说我更愿意给我的 ORM JDBC JPA 一个 JavaCalendar 或乔达DataTime 与说时区Ameri
  • 动态创建的文本框的 JavaScript 验证

    在表单中 通过单击 添加 按钮动态创建文本框 以便在新行中创建文本框 现在我的问题是动态创建的文本框的验证 以便如果有任何文本框 它会显示一条消息单击 提交 按钮提交表单时留空 请帮助我 EDIT
  • Python Plotly - 对齐散点图和条形图的 Y 轴

    我正在尝试使用散点图和图形元素创建一个绘图图 一切都很顺利 但有一个问题 两个 Y 轴没有围绕 0 对齐 我尝试过使用不同的属性 例如 mirror 和tick0 我也尝试遵循plotly网站上的示例 但它主要是具有相同图形类型的多个y轴
  • 在数据重新加载时保存 WPF TreeView 状态

    我正在使用 TreeView 在 UI 中显示我的数据 现在 我的应用程序每 5 秒刷新一次 以便显示最新的数据 有没有办法即使在窗口重新加载后也可以保存树视图的展开状态或折叠状态 因为如果我有大量数据并且需要超过 5 秒才能转到所需数据
  • 如何在 Blazor 组件上进行双向绑定

    我想创建自定义输入 所以我创建了这个组件 MyInputComponent razor div div