簡體   English   中英

如何動態生成 blazor 的 @bind-Value?

[英]How to generate dynamically blazor's @bind-Value?

我在玩 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");

您無法綁定,但您可以使用回調和 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 控件,但您可以使用任何控件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM