Blazor 数据绑定动态生成的元素
Blazor data-bind dynamically generated elements
我想从我的 Blazor 网页上的“AdditionalFields”列表动态创建和绑定一些 select
元素。
我需要将每个元素绑定到 CheckoutData
变量。
但我不知道如何创建变量/数组或类似的东西,通过绑定值正确更新。
详情可以看我的附件(Image)和这个源码:
@if (StoreData.StoreContainer?.AdditionalFields != null)
@foreach (var additionalField in StoreData.StoreContainer.AdditionalFields)
{
<div class="col-sm-6">
<div class="page_input">
<label> @additionalField.Caption </label>
<InputSelect class="checkout-control pristine untouched" @bind-Value="@CheckoutData.OrderTimeType">
@foreach (var keyValue in additionalField.ValueList)
{
<option value="@keyValue.Sort" selected="@(keyValue == additionalField.ValueList[0] ? "selected" : "")">@keyValue.SelectionText</option>
}
</InputSelect>
</div>
</div>
}
我创建了一个示例 BlazorFiddle,它展示了如何处理 AdditionalFields
列表中的 select 个元素,大致按照您在问题中的示例。
为了显示 selection,我在 AdditionalField
class 中添加了 .Selected
属性,但您可能将其存储在别处。
注意要点:
int count = additionalFields.Count;
for (var i=0; i < count; i++)
{
int current = i; // don't use loop variable in binding
var additionalField = additionalFields[current];
我使用 for
循环遍历 AdditionalFields
并在循环中保存当前索引 - 这对于确保不在 [=17 中传递循环变量很重要=] 事件处理程序。我在这里没有使用 bind
,所以很容易看出会发生什么。
<select class="checkout-control pristine untouched" @onchange="((e) => HandleSelect(e, current))" >
我使用了 HTML select 而不是 InputSelect
,并处理了 @onchange
事件:这传递了事件参数 e
和当前HandleSelect
方法的索引
您可能需要采用这种方法,但它展示了一种可以在 Blazor 中动态绑定的方法。
重要说明:代码将第二个字段的 Selected
值设置为第二个排序值,以证明 selected
属性正常工作。
但是,请注意第一个字段将 "sort 1" 显示为 selected 但不会触发事件 - 这是 HTML auto -selecting select 列表中的第一个元素,因此第一个元素的 Selected
属性 仍然为空。要么确保 Selected 在开始时设置,例如到第一个值,或者有一个空白 <option value="">[select a sort]</option>
作为将绑定到空白 select.
的第一个项目
我想从我的 Blazor 网页上的“AdditionalFields”列表动态创建和绑定一些 select
元素。
我需要将每个元素绑定到 CheckoutData
变量。
但我不知道如何创建变量/数组或类似的东西,通过绑定值正确更新。
详情可以看我的附件(Image)和这个源码:
@if (StoreData.StoreContainer?.AdditionalFields != null)
@foreach (var additionalField in StoreData.StoreContainer.AdditionalFields)
{
<div class="col-sm-6">
<div class="page_input">
<label> @additionalField.Caption </label>
<InputSelect class="checkout-control pristine untouched" @bind-Value="@CheckoutData.OrderTimeType">
@foreach (var keyValue in additionalField.ValueList)
{
<option value="@keyValue.Sort" selected="@(keyValue == additionalField.ValueList[0] ? "selected" : "")">@keyValue.SelectionText</option>
}
</InputSelect>
</div>
</div>
}
我创建了一个示例 BlazorFiddle,它展示了如何处理 AdditionalFields
列表中的 select 个元素,大致按照您在问题中的示例。
为了显示 selection,我在 AdditionalField
class 中添加了 .Selected
属性,但您可能将其存储在别处。
注意要点:
int count = additionalFields.Count;
for (var i=0; i < count; i++)
{
int current = i; // don't use loop variable in binding
var additionalField = additionalFields[current];
我使用 for
循环遍历 AdditionalFields
并在循环中保存当前索引 - 这对于确保不在 [=17 中传递循环变量很重要=] 事件处理程序。我在这里没有使用 bind
,所以很容易看出会发生什么。
<select class="checkout-control pristine untouched" @onchange="((e) => HandleSelect(e, current))" >
我使用了 HTML select 而不是 InputSelect
,并处理了 @onchange
事件:这传递了事件参数 e
和当前HandleSelect
方法的索引
您可能需要采用这种方法,但它展示了一种可以在 Blazor 中动态绑定的方法。
重要说明:代码将第二个字段的 Selected
值设置为第二个排序值,以证明 selected
属性正常工作。
但是,请注意第一个字段将 "sort 1" 显示为 selected 但不会触发事件 - 这是 HTML auto -selecting select 列表中的第一个元素,因此第一个元素的 Selected
属性 仍然为空。要么确保 Selected 在开始时设置,例如到第一个值,或者有一个空白 <option value="">[select a sort]</option>
作为将绑定到空白 select.