Blazor将数据绑定到集合?

时间:2019-12-15 01:49:24

标签: c# asp.net data-binding blazor

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

@foreach (var prop in formProperties)
{
    <InputText id=@prop.Name @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.

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

2 个答案:

答案 0 :(得分:3)

遇到一个类似的问题,我试图基于属性字典构建表,我从史蒂夫那里碰到this reply

基本上,您可以做的是引入一种新的类型,例如。

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" />
}

可以说,这比使用链式绑定创建新组件更直接。

答案 1 :(得分:0)

不幸的是,您目前不能将<InputText/>组件用于更复杂的访问器。

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

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

使用您的代码:

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

同样,您将丢失变更通知,验证以及与EditForm和EditContext的所有连接。

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

仅供参考,我进行了快速搜索,但在github中没有看到该问题(可能是功能),但是当我找到它时,我将对其进行更新。