C# Blazor服务器:<;InputSelect和@oninput事件给出了奇怪的行为

C# Blazor服务器:<;InputSelect和@oninput事件给出了奇怪的行为,c#,.net-core,blazor,C#,.net Core,Blazor,我有一系列3个InputSelects,第二个是通过SQL查询从第一个级联而来的。当通过oninput事件选择第一个下拉列表时,我有额外的逻辑运行。(我知道onchange和bind值不能在同一个元素上声明) 选择第一个后,我的值将填充,但在一瞬间从文本区域消失,尽管数据实际上存在于模型中,并且通过使用相关记录填充第二个框,其余逻辑正常工作: 选择前: 选择后: 相关代码: <EditForm Model="@plansold" OnValidSubmit=&quo

我有一系列3个InputSelects,第二个是通过SQL查询从第一个级联而来的。当通过oninput事件选择第一个下拉列表时,我有额外的逻辑运行。(我知道onchange和bind值不能在同一个元素上声明)

选择第一个后,我的值将填充,但在一瞬间从文本区域消失,尽管数据实际上存在于模型中,并且通过使用相关记录填充第二个框,其余逻辑正常工作:

选择前:

选择后:

相关代码:

<EditForm Model="@plansold" OnValidSubmit="HandleValidSubmit" OnInvalidSubmit="HandleInvalidSubmit">
            <FluentValidator />
                <div class="row">
                    <div class="col-md-4">
                        <div class="form-group">
                            @if (categories == null)
                            {<p><em>Loading ...</em></p>} //Null check
                            else
                            {                                   
                                <InputSelect TValue="string" class="form-control" @bind-Value="plansold.PlanCategoryDesc" @oninput="CategoryChange">
                                    <option value="Select..." selected disabled="disabled">(Select Plan Category)</option>
                                    @foreach (var c in categories)
                                    {
                                        <option value="@c.id"> @c.Description</option>
                                    }
                                </InputSelect>
                                <ValidationMessage For="@(() => plansold.PlanCategoryDesc)" class="text-danger" />

                            }
                        </div>
                    </div>
最初,这些都是简单的元素,使用@onchange,效果很好,但是为了让验证消息像我的文本框那样消失,我切换到并在兔子洞里呆了一整天,试图将行为设置正确。我还尝试了bind Value:event=“CategoryChange”但没有成功

这是Blazor服务器5.0。有人知道如何在oninput事件之后将显示持久化到下拉元素中吗


谢谢

为Syncfusion控件竖起两个大拇指:

          <div class="col-md-4">
                <div class="form-group">
                    @if (categories == null)
                    {<p><em>Loading ...</em></p>} //Null check
                    else
                    {
                        <div class="padding-top">
                            <SfDropDownList TItem="ITQA_CategoryModel" TValue="string" Placeholder="(Select Plan Category)" PopupHeight="auto" DataSource="@categories">
                                <DropDownListEvents TItem="ITQA_CategoryModel" TValue="string" ValueChange="@CategoryChange"></DropDownListEvents>
                                <DropDownListFieldSettings Text="Description" Value="id"></DropDownListFieldSettings>
                            </SfDropDownList>
                            <ValidationMessage For="@(() => plansold.PlanCategoryDesc)" class="text-danger" />
                        </div>
                    }
                </div>
            </div>
            <div class="col-md-4">
                <div class="form-group">
                    <div class="padding-top">
                        <SfDropDownList Enabled="@PlansDetailEnabled" TItem="ITQA_PlansModel" TValue="string" Placeholder="(Select Plan Length)" PopupHeight="auto" DataSource="@plans">
                            <DropDownListEvents TItem="ITQA_PlansModel" TValue="string" ValueChange="@PlanChange"></DropDownListEvents>
                            <DropDownListFieldSettings Text="PlanLength" Value="id"></DropDownListFieldSettings>
                        </SfDropDownList>
                        <ValidationMessage For="@(() => plansold.PlanLength)" class="text-danger" />
                    </div>
                </div>
            </div>

 private async Task CategoryChange(Syncfusion.Blazor.DropDowns.ChangeEventArgs<string, ITQA_CategoryModel> args)
{
    if (string.IsNullOrWhiteSpace(args.Value.ToString()) == false)
    {
        catid = Convert.ToInt32(args.Value);
        plans = await plansService.GetPlanOptions(catid);
        plansold.PlanCategory = Convert.ToInt32(args.Value);
        plansold.PlanCategoryDesc = args.ItemData.Description;
        PlansDetailEnabled = true;

    }
}

private void PlanChange(Syncfusion.Blazor.DropDowns.ChangeEventArgs<string, ITQA_PlansModel> args)
{
    if (string.IsNullOrWhiteSpace(args.Value.ToString()) == false)
    {
        plansold.PlanLength = args.ItemData.PlanLength;
        plansold.PlanCost = args.ItemData.PlanCost;
    }
}

@如果(类别==null)
{正在加载…

}//Null检查 其他的 { } 专用异步任务类别更改(Syncfusion.Blazor.DropDowns.ChangeEventArgs args) { if(string.IsNullOrWhiteSpace(args.Value.ToString())==false) { catid=转换为32(参数值); 计划=等待计划服务.GetPlanOptions(catid); PlanSeld.PlanCategory=转换为32(参数值); plansaled.PlanCategoryDesc=args.ItemData.Description; PlansDetailEnabled=真; } } 私有void平面更改(Syncfusion.Blazor.DropDowns.ChangeEventArgs args) { if(string.IsNullOrWhiteSpace(args.Value.ToString())==false) { PlanSeld.PlanLength=args.ItemData.PlanLength; plansaled.PlanCost=args.ItemData.PlanCost; } }
          <div class="col-md-4">
                <div class="form-group">
                    @if (categories == null)
                    {<p><em>Loading ...</em></p>} //Null check
                    else
                    {
                        <div class="padding-top">
                            <SfDropDownList TItem="ITQA_CategoryModel" TValue="string" Placeholder="(Select Plan Category)" PopupHeight="auto" DataSource="@categories">
                                <DropDownListEvents TItem="ITQA_CategoryModel" TValue="string" ValueChange="@CategoryChange"></DropDownListEvents>
                                <DropDownListFieldSettings Text="Description" Value="id"></DropDownListFieldSettings>
                            </SfDropDownList>
                            <ValidationMessage For="@(() => plansold.PlanCategoryDesc)" class="text-danger" />
                        </div>
                    }
                </div>
            </div>
            <div class="col-md-4">
                <div class="form-group">
                    <div class="padding-top">
                        <SfDropDownList Enabled="@PlansDetailEnabled" TItem="ITQA_PlansModel" TValue="string" Placeholder="(Select Plan Length)" PopupHeight="auto" DataSource="@plans">
                            <DropDownListEvents TItem="ITQA_PlansModel" TValue="string" ValueChange="@PlanChange"></DropDownListEvents>
                            <DropDownListFieldSettings Text="PlanLength" Value="id"></DropDownListFieldSettings>
                        </SfDropDownList>
                        <ValidationMessage For="@(() => plansold.PlanLength)" class="text-danger" />
                    </div>
                </div>
            </div>

 private async Task CategoryChange(Syncfusion.Blazor.DropDowns.ChangeEventArgs<string, ITQA_CategoryModel> args)
{
    if (string.IsNullOrWhiteSpace(args.Value.ToString()) == false)
    {
        catid = Convert.ToInt32(args.Value);
        plans = await plansService.GetPlanOptions(catid);
        plansold.PlanCategory = Convert.ToInt32(args.Value);
        plansold.PlanCategoryDesc = args.ItemData.Description;
        PlansDetailEnabled = true;

    }
}

private void PlanChange(Syncfusion.Blazor.DropDowns.ChangeEventArgs<string, ITQA_PlansModel> args)
{
    if (string.IsNullOrWhiteSpace(args.Value.ToString()) == false)
    {
        plansold.PlanLength = args.ItemData.PlanLength;
        plansold.PlanCost = args.ItemData.PlanCost;
    }
}