Blazor 将数据绑定到集合?

问题描述 投票:0回答:2

我正在尝试以编程方式使用 Blazor 生成表单,但遇到了一个问题,我需要将 InputText 值绑定到集合的成员,例如:

@foreach (var prop in formProperties)
{
    <InputText [email protected] @bind-Value="form.Responses[prop.Name]" />
}

但是,我遇到以下异常:

System.ArgumentException: The provided expression contains a InstanceMethodCallExpression1 which is not supported. FieldIdentifier only supports simple member accessors (fields, properties) of an object.

是否可以将输入绑定到某种类型的集合?

c# asp.net data-binding blazor
2个回答
10
投票

遇到类似的问题,我试图根据属性字典构建一个表,我遇到了来自 Steve 的这个回复

基本上你可以做的是引入一种新类型,称为例如

public class FormResponse
{
    public string Value { get; set; }
}

假设您现在在

FormResponse
对象上创建了
form
的字典,那么您可以执行以下操作:

@foreach (var prop in formProperties)
{
    <InputText id="@prop.Name" @bind-Value="form.Responses[prop.Name].Value" />
}

这可以说比使用链式绑定创建新组件更简单。


3
投票

不幸的是,目前您无法将

<InputText/>
组件用于更复杂的访问器。

但是,如果您不介意处理自己的验证/通知代码,您可以通过以下方式自行实现:

  • <InputText/>
    更改为
    <input/>
  • 使用
    @bind
    代替
    @bind-Value

使用您的代码:

@foreach (var prop in formProperties)
{
    <input [email protected] @bind="form.Responses[prop.Name]" />
}

再次,您将失去更改通知、验证以及与 EditForm 和 EditContext 的所有连接。

您还可以采用@dennis1679 建议的路线,创建一个子组件。我很好奇Chained Binding与顶级表单/模型验证的集成在实践中会是什么样子。我还没玩过呢。

仅供参考,我快速搜索了一下,并没有在 github 中看到该问题(可能是一个功能),但是当我找到它时,我会更新它。

© www.soinside.com 2019 - 2024. All rights reserved.