【问题标题】:How to generate dynamically blazor's @bind-Value?如何动态生成 blazor 的@bind-Value?
【发布时间】:2020-01-02 22:12:50
【问题描述】:

我正在使用 Blazor,我想创建一个动态生成的表单,它是网格的一部分。 数据的实体类型被传递到网格,这是表单的基础。我现在面临的问题是@bind-Value,它是编辑给定实体所必需的。

我使用BlazorStrap,它是一个 Blazor 服务器端项目。

我在剃须刀文件中有以下代码:

@{
string bind = $"{nameof(_editedItem)}.{propertyInfo.Name}";
}
<BSBasicInput InputType="InputType.Text"
              id="@propertyInfo.Name"
              @bind-Value="@bind"/>

有问题的部分是最后一行。始终显示 _variableName.PropertyName 而不是从对象中提取值。

正确的代码应该是这样的:

<BSBasicInput InputType="InputType.Text"
              id="@propertyInfo.Name"
              @bind-Value="_variableName.PropertyName"/>

到目前为止我尝试了什么:

  • 多种风格的语法,但是,由于我对 Razor 语法并没有真正的经验,所以在我碰壁之后
  • 调试显示我想编辑的变量得到了它的值,所以问题出在某处生成的@bind-Value
  • 我还检查了生成的代码(.g 文件),但我没有发现那里有异味(请在下面找到)
  • 我还没有创建没有动态生成表单的 POC,因为创建类似复杂性的东西需要几个小时。

这里有什么解决办法?

#nullable restore
#line 24 "/../..ModalEdit.razor"
                                                        bind

#line default
#line hidden
#nullable disable
                        , 31, Microsoft.AspNetCore.Components.EventCallback.Factory.Create(this, Microsoft.AspNetCore.Components.CompilerServices.RuntimeHelpers.CreateInferredEventCallback(this,
__value => bind = __value, bind)));
                        __builder4.AddMarkupContent(32, "\n");

【问题讨论】:

    标签: c# razor blazor-server-side


    【解决方案1】:

    你不能绑定,但你可以使用回调和 lambda 函数来归档相同的结果:

                @if (user != null)
                {
                    @foreach (var property in user.GetType().GetProperties())
                    {
                        <Field>
                            <FieldLabel>@(property.Name): @(property.PropertyType.FullName)</FieldLabel>
                            @switch (property.PropertyType.FullName)@*Chose editing style*@
                            {
                                case "System.String":
                                    <TextEdit Text="@property.GetValue(user)?.ToString()" TextChanged="value => property.SetValue(user, value)" />
                                    break;
                                case "System.Boolean":
                                    <Switch TValue="bool" Checked="(bool)property.GetValue(user)" CheckedChanged="value => property.SetValue(user, value)" />
                                    break;
                                default: /*Unsuported/Not implemented editing*/
                                    <TextEdit Text="@property.GetValue(user)?.ToString()" Disabled="true" />
                                    break;
                            }
                        </Field>
                    }
                }
    

    我在此示例中使用 Blazorise 控件,但您可以使用任何控件。

    【讨论】:

      猜你喜欢
      • 2020-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-30
      • 2021-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多