C# Blazor-不触发表单上下文模型更改
我在blazor应用程序中有一个订单页面,它接受订单的详细信息,并带有一个添加订单行的表格。我有一个名为CalculateTotals的函数,每次更改字段(如数量或单价)时都需要调用该函数,以便在用户提交订单之前更新UI中的总计 似乎所有的功能都适用于任何控件,而不是。在每个订单行中也有一项税收征收。这通过在每个订单行的税行中循环显示,并显示用户选择税代码的下拉列表来表示。当进行选择时,@onchange似乎被触发,因为我可以在模型的json输出中看到值的变化,但是CalculateTotals函数从未被调用,因此代码中的onfieldchanged事件没有被触发。它似乎在为我使用的任何东西做这个,不管它在editform中的什么位置。我使用而不是,因为我的下拉列表值是guid。有人知道为什么onFieldChange事件不会作为模型字段更改触发吗?下面是我的代码片段C# Blazor-不触发表单上下文模型更改,c#,blazor,C#,Blazor,我在blazor应用程序中有一个订单页面,它接受订单的详细信息,并带有一个添加订单行的表格。我有一个名为CalculateTotals的函数,每次更改字段(如数量或单价)时都需要调用该函数,以便在用户提交订单之前更新UI中的总计 似乎所有的功能都适用于任何控件,而不是。在每个订单行中也有一项税收征收。这通过在每个订单行的税行中循环显示,并显示用户选择税代码的下拉列表来表示。当进行选择时,@onchange似乎被触发,因为我可以在模型的json输出中看到值的变化,但是CalculateTotals
<EditForm EditContext="@formContext">
<DataAnnotationsValidator />
<ValidationSummary />
<div class="row">
<div class="col-12">
<div class="card">
<div class="row">
<div class="col-12">
<div class="table-responsive">
<table class="table mt-4" ondragover="event.preventDefault();">
<thead>
<tr>
<th>#</th>
<th>Description</th>
<th>Quantity</th>
<th>Unit Cost</th>
<th>Taxes</th>
<th class="text-right">Total</th>
</tr>
</thead>
<tbody>
@if (order.OrderLines != null)
{
foreach (var line in order.OrderLines.OrderBy(x => x.LineNumber))
{
<tr >
<div id="dragdiv" class="dragula-handle" draggable="true" @ondrop="@(()=> Drop(line))" @ondrag="@(()=> StartDrag(line))" @key="line.Id"></div>
<td>
<InputText id="item-desc" @bind-Value="line.Description" class="form-control form-control-sm" disabled="@FormDisabled" placeholder="Description" />
</td>
<td>
<InputNumber id="item-qty" @bind-Value="line.Quantity" class="form-control form-control-sm" disabled="@FormDisabled" placeholder="Qty" />
</td>
<td>
<InputNumber id="item-unit-cost" @bind-Value="@line.AmountPerUnit" class="form-control form-control-sm" disabled="@FormDisabled" placeholder="Unit Cost" />
<ValidationMessage For="@(() => line.AmountPerUnit)" />
</td>
<td>
@if (line.Taxes != null)
{
foreach (var tax in line.Taxes)
{
<select id="tax-@tax.TaxCodeId" @bind="tax.TaxCodeId" class="form-control">
@if (taxCodes != null)
{
foreach (var taxcode in taxCodes)
{
<option value="@taxcode.Id">@taxcode.Name</option>
}
}
</select>
}
}
</td>
</tr>
}
}
</tbody>
</table>
</div> <!-- end table-responsive-->
</div> <!-- end col -->
</div>
<!-- end row -->
</div> <!-- end card-body-->
</div> <!-- end card -->
</div> <!-- end col-->
</div>
</EditForm>
@code {
protected override async Task OnInitializedAsync()
{
await Load();
formContext = new EditContext(order);
formContext.OnFieldChanged += EditContext_OnFieldChanged;
await base.OnInitializedAsync();
}
private void EditContext_OnFieldChanged(object sender,FieldChangedEventArgs e)
{
Console.WriteLine(e.FieldIdentifier.FieldName);
if (formContext.Validate())
{
// You can validate the EditContext here, and do necessary
CalculateTotals();
}
}
}
每个输入*接收级联参数中的。当值发生变化时,他们调用该函数来触发字段验证
如果不使用InputSelect,则不会进行字段验证。但是你可以自己做
选择组件。每个输入*接收级联参数中的。当值发生变化时,他们调用该函数来触发字段验证
如果不使用InputSelect,则不会进行字段验证。但是你可以自己做
选择组件。好的,所以这里最简单的方法是尝试使用InputSelect,但是我发现它仍然存在一个错误,不支持Guid值。如果我必须这样做,我可能会创建从MS InputSelect派生的InputSelect,将GUID转换为字符串。完美。。。毕竟没什么大不了的。。。将我的Webapi更改为将ID显示为字符串,我们可以开始了。感谢您的指导afm.ok,所以这里最简单的方法是尝试使用InputSelect,但是我发现它仍然存在一个bug,不支持Guid值。如果我必须这样做,我可能会创建从MS InputSelect派生的InputSelect,将GUID转换为字符串。完美。。。毕竟没什么大不了的。。。将我的Webapi更改为将ID显示为字符串,我们可以开始了。感谢您对afm的指导。