0

我正在尝试完成类似于 Angular FormBuilder 的功能,我们在其中动态添加控件和验证。

在 MudBlazor 或一般的 Blazor 中,我们必须使用 C# Model 来绑定 Controls。

所以我决定使用 ExpandoObject 和动态添加的属性来绑定 MudBlazor 控件,OnInitialized方法如下

    dynamic FormModel = new ExpandoObject();
    protected override void OnInitialized()
    {
        FormModel.FirstName = null;
        FormModel.LastName = null;
        FormModel.Age = 0;

        //Or with Dictionary

       ((IDictionary<string, object>)FormModel).Add("FirstName", "");
        ((IDictionary<string, object>)FormModel).Add("LastName", "");
        ((IDictionary<string, object>)FormModel).Add("Age", 0);
    }

在 HTML 中使用 MudBlazor 文本框

<MudTextField Label="First name" @bind-Value=FormModel.FirstName />

使用第一种方法编译时,会出现以下错误

如果不先将 lambda 表达式转换为委托或表达式树类型,则无法将 lambda 表达式用作动态分派操作的参数。

在使用第二种“对象”方法运行时,它会在运行时出现错误,当值被更改/输入时。

未实现到类型 System.Object 的转换

4

1 回答 1

0

上个月我正在做一个项目,我得到了一个包含未知数量表的数据集,每个表都有未知数量的列和类型,我的目标是使每个表及其列可编辑,我以这种方式实现了这一点

这是html部分

<div>
    <div>@($"{Fields["FirstName"]} {Fields["LastName"]}")</div>

    @foreach (var field in Fields)
    {
        <div>
            <input type="text" @bind=@Fields[field.Key] @bind:event="oninput"/>
        </div>
    }
</div>

这是后面的代码

@code {
    private Dictionary<string, string> Fields;

    protected override void OnInitialized()
    {
        //  Intialize dictionary
        Fields = new();

        //  Initialize input fields with some default value
        Fields.Add("FirstName", "first"); 
        Fields.Add("LastName", "last");
    }
}

只是提出一个想法,如果这对您有帮助,我创建了一个自定义输入控件,它根据数据类型处理字符串、数字和布尔输入值

没有使用 MudBlazor 的经验,但我认为自定义绑定转换器可用于字符串和数字数据类型

<MudTextField Converter="@StringConverter" Label="First name" @bind-Value=@Fields["FirstName"] />
<MudTextField Converter="@StringConverter" Label="Last name" @bind-Value=@Fields["LastName"] />

<div>@($"{Fields["FirstName"]} {Fields["LastName"]}")</div>

@code {

     private Dictionary<string, object> Fields;

     protected override void OnInitialized()
    {
        //  Intialize dictionary
        Fields = new();

        //  Initialize input fields with some default value
        Fields.Add("FirstName", "first"); 
        Fields.Add("LastName", "last");
    }

    Converter<object> StringConverter = new Converter<object>
    {
        SetFunc = value => value.ToString(),
        GetFunc = text => text.ToString(),
    };
    
}
于 2022-02-27T10:06:31.423 回答