首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将ExpandoObject绑定到MudBlazor窗体控件

将ExpandoObject绑定到MudBlazor窗体控件
EN

Stack Overflow用户
提问于 2022-02-27 07:43:17
回答 1查看 471关注 0票数 0

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

通常,在MudBlazor或Blazor中,我们必须使用C#模型来绑定控件。

因此,我决定将ExpandoObject与动态添加的属性一起使用OnInitialized方法与MudBlazor控件绑定,如下所示

代码语言:javascript
复制
    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文本框

代码语言:javascript
复制
<MudTextField Label="First name" @bind-Value=FormModel.FirstName />

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

不能使用lambda表达式作为动态分派操作的参数,除非首先将其转换为委托或表达式树类型。

当使用第二个"object“方法运行时,当值被更改/输入时,它会在运行时产生错误。

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

EN

回答 1

Stack Overflow用户

发布于 2022-02-27 10:06:31

上个月,我正在做一个项目,在这个项目中,我得到了一个包含未知数量的表和每个表的数据集,因为每个表的列和类型都是未知的,我的目标是使每个表及其列都是可编辑的,我就是这样实现的。

这是html部分

代码语言:javascript
复制
<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>

下面是代码

代码语言:javascript
复制
@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");
    }
}

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

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

代码语言:javascript
复制
<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(),
    };
    
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71283001

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档