C# Blazor-不触发表单上下文模型更改

C# Blazor-不触发表单上下文模型更改,c#,blazor,C#,Blazor,我在blazor应用程序中有一个订单页面,它接受订单的详细信息,并带有一个添加订单行的表格。我有一个名为CalculateTotals的函数,每次更改字段(如数量或单价)时都需要调用该函数,以便在用户提交订单之前更新UI中的总计 似乎所有的功能都适用于任何控件,而不是。在每个订单行中也有一项税收征收。这通过在每个订单行的税行中循环显示,并显示用户选择税代码的下拉列表来表示。当进行选择时,@onchange似乎被触发,因为我可以在模型的json输出中看到值的变化,但是CalculateTotals

我在blazor应用程序中有一个订单页面,它接受订单的详细信息,并带有一个添加订单行的表格。我有一个名为CalculateTotals的函数,每次更改字段(如数量或单价)时都需要调用该函数,以便在用户提交订单之前更新UI中的总计

似乎所有的功能都适用于任何控件,而不是。在每个订单行中也有一项税收征收。这通过在每个订单行的税行中循环显示,并显示用户选择税代码的下拉列表来表示。当进行选择时,@onchange似乎被触发,因为我可以在模型的json输出中看到值的变化,但是CalculateTotals函数从未被调用,因此代码中的onfieldchanged事件没有被触发。它似乎在为我使用的任何东西做这个,不管它在editform中的什么位置。我使用而不是,因为我的下拉列表值是guid。有人知道为什么onFieldChange事件不会作为模型字段更改触发吗?下面是我的代码片段

<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的指导。