InputCheckBox - 根据条件选中复选框

InputCheckBox - check the box based on a condition

此处的目标是将复选框绑定到对象的布尔变量。现在,当我们选中该框时,它应该会弹出一个确认消息,如果我 select 'yes' 它应该继续执行该过程,但是如果我 select 'no' 那么它应该回到原来的状态。因此,对于演示,我实现了一个确认框并在那里检查条件。

Razor 文件:

<InputCheckbox @bind-Value="@product.IsAssociated" @oninput="(e)=>AssociateProducts(e,product)"/>

代码:

public async void AssociateProducts(ChangeEventArgs e,Product product)
{
   bool confirmed = await JSRuntime.InvokeAsync<bool>("confirm", "Are you sure?");
   if (confirmed)
   {
      //normal procedure
   }
   else
   {     
       //this code isn't changing the state  
       product.IsAssociated = false;
       StateHasChanged();
   }
}

所以当我们给出 'No' 作为我们的答案时,这段代码执行:

   else
   {     
       //this code isn't changing the state  
       product.IsAssociated = false;
       StateHasChanged();
   }

我希望在此之后取消选中该复选框。 这不会改变我们产品的状态,它只是在我打印并检查时 'TRUE'。

我怎样才能做到这一点?

我只是添加 EditForm 并且成功了。

@page "/"
@inject IJSRuntime JsRuntime


<PageTitle>Index</PageTitle>


<EditForm Model="@product">
    <InputCheckbox @bind-Value="@product.IsAssociated" @oninput="(e)=>AssociateProducts(e,product)"/>
</EditForm>



@code{

    public Product product { get; set; } = new Product();

    public async void AssociateProducts(ChangeEventArgs e,Product product)
    {
       bool confirmed = await JsRuntime.InvokeAsync<bool>("confirm", "Are you sure?");
       if (confirmed)
       {
          //normal procedure
       }
       else
       {     
           //this code isn't changing the state  
           product.IsAssociated = false;
           StateHasChanged();
       }
    }
}

演示

希望是你所期待的

这是我的第二个答案...这就是您必须如何编码和使用逻辑

使用 change 事件或 input 事件,但不能同时使用。当您这样做时:

    `@bind-Value="@product.IsAssociated" @oninput=" 
                               (e)=>AssociateProducts(e,product)"`

您正在使用两个事件,而您可以并且应该使用一个事件:change

请使用 async Task 而不是 async void

最重要的是,您的逻辑是错误的:当您第一次 运行 应用程序并且 product.IsAssociated 是错误的。用户选中复选框,他单击“确定”作为确认。假设他决定在这个动作之后取消他之前的选择。为此,他应该单击选中的复选框以撤消之前的操作。您的代码不会这样做,也不会考虑单击“取消”按钮。

@page "/"

 @inject IJSRuntime JSRuntime
 <EditForm Model="product">
    <InputCheckbox ValueExpression="@( () => product.IsAssociated )" 
                   Value="@product.IsAssociated" 
                   ValueChanged="@( (bool args) => AssociateProducts(args, product) )"/>
</EditForm>

<div>product.IsAssociated: @product.IsAssociated</div>
@code { 

    private Product product = new Product { ID = 1, Name = "Product1", IsAssociated = false };

    public async Task AssociateProducts(bool args, Product product)
    {
        bool confirmed = await JSRuntime.InvokeAsync<bool>( "confirm", new [] { "Are you sure?" });

        if (confirmed && !product.IsAssociated)
        {
             product.IsAssociated = true;
        }
        else if(confirmed && product.IsAssociated)
        {
             product.IsAssociated = false;
            
        }
    }

    public class Product
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public bool IsAssociated { get; set; }

    }
}