Blazor InputText 在 TextChanged 时调用异步方法

bae*_*999 5 blazor

我尝试捕获 Blazor(服务器端)中 InputText 的文本更改,然后调用异步方法来检查输入是否是正确的优惠券代码。

HTML:

<EditForm Model="@Basket" OnValidSubmit="@CommitBasket">
    Gutscheincode
    <InputText class="coupon-input checkout-control pristine untouched" 
            @bind-Value="CouponCode"
            @onchange="CouponCodeChanged">
    </InputText>
    @CouponText
</EditForm>`
Run Code Online (Sandbox Code Playgroud)

但是 CouponCodeChanged 没有引发 - OnKeyUp 没有用,因为文本值在该状态下没有改变......

这是 C# 方法:

public async Task CouponCodeChanged(ChangeEventArgs args)
{
    using var client = ClientFactory.CreateClient();
    var result = await ApiCalls.GetCouponCodeData(client, AppState.BaseUrl, 2, CouponCode);
    CouponText = result== null ? "NOT FOUND" : $"exists:{result.Exists} amount:{result.Amount}";
}
Run Code Online (Sandbox Code Playgroud)

有谁提示或想法如何以方便的方式解决这个问题?

谢谢!

agu*_*ars 3

InputText组件没有onchange事件,但是ValueChanged.
然而,如果你想订阅这个事件,你需要传递一个ValueExpression,这并不容易。我发现订阅此事件最简单的方法是覆盖该InputText组件。

优惠券组件.razor

@inherits InputText
<InputText class="coupon-input checkout-control pristine untouched" 
                   ValueExpression="ValueExpression" Value="@Value" ValueChanged="OnValueChanged" />
@code {
  [Parameter]
  public EventCallback<string> CouponValueChanged { get; set; }

  private async Task OnValueChanged(string value)
  {
     await ValueChanged.InvokeAsync(value);
     using var client = ClientFactory.CreateClient();
     var result = await ApiCalls.GetCouponCodeData(client, AppState.BaseUrl, 2, CouponCode);
     var coupon = result == null ? "NOT FOUND" : $"exists:{result.Exists} amount:{result.Amount}"
     await CouponValueChanged.InvokeAsync(coupon);
  }
}
Run Code Online (Sandbox Code Playgroud)

用法

<EditForm Model="@Basket" OnValidSubmit="@CommitBasket">
    Gutscheincode
    <CouponComponent @bind-Value="CouponCode"
        @CouponValueChanged="CouponCodeChanged">
    </InputText>
    @CouponText
</EditForm>

@code {
   private void CouponCodeChanged(string coupon)
   {
      CouponText = coupon;
      StateHasChanged();
   }
}
Run Code Online (Sandbox Code Playgroud)