blazor - 如何告诉或允许 Blazor 将 HTML 元素从其未更改的绑定(bind)值变为 "refresh"?

标签 blazor

当我在 HTML 元素上进行单向绑定(bind)并在 onchange 上进行附带绑定(bind)时,该绑定(bind)并不总是会更改它,那么我如何告诉或允许 Blazor“刷新”该元素的值从它没有改变的绑定(bind)值?

StateHasChanged() 不起作用,可能是因为 Blazor 检测到没有发生任何更改。

极简但荒谬的示例(请注意,现实世界的案例并不荒谬):

@page "/"
<select value="@Foo" @onchange="Update">
  <option>First</option>
  <option>Second</option>
</select> 
<div>
  Value of Foo: @Foo
</div>
@code {
  private string Foo {get;set;} = "First";
  private void Update(ChangeEventArgs args) {
    return; // doesn't actually change it
  }
}

因此,HTML 元素中的新值在更改时立即显示,但绑定(bind)值实际上从未更改。 Working demo here :如何使下拉列表的值保持(或更改回)“First”,即存储在 Foo 中的未更改值?

最佳答案

最简单的方法是为元素提供一个@key,当您想要强制刷新时可以更改该值。但这将完全拆除并重新创建元素,因此成本可能很高。

@page "/"

<select @key="@Forced" value="@Foo" @onchange=@( e => Update(e) )>
  <option>(none)</option>
  <option>First</option>
  <option>Second</option>
</select> 
@code {
  private string Foo {get;set;} = "First";
  private int Forced {get;set;} = 0;
  private Task Update(ChangeEventArgs args) {
    if (1 == 1){ // placeholder for other logic 
      Forced++; // doesn't actually change it
    }
    else
    {
      Foo = args.Value.ToString() ?? "(none)";
    }
    return Task.CompletedTask; 
  }
}

Updated demo

关于blazor - 如何告诉或允许 Blazor 将 HTML 元素从其未更改的绑定(bind)值变为 "refresh"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72046999/

相关文章:

asp.net-core - 如何像 JavaScript-SPA 一样托管 ASP.NET API 和 Blazor Web 程序集?

c# - 无法在 Razor 页面中从 'method group' 转换为 'bool'

iis - Blazor Wasm 独立发布到 IIS

blazor - 如何在 Blazor 中迭代 TValue 类型属性

html - 输入范围的 Blazor 数据绑定(bind)似乎无法与浮点步骤正常工作

.net-core - 如何在 Blazor WebAssembly 中使用 Roslyn 创建 CSharpCompilation?

.net-core - 被 CORS 策略阻止的 Blazor 请求

blazor - 为什么我的 Blazor 单选按钮必须单击两次才能选择,而单击复选框时则必须取消选择?

docker - 是否可以将环境变量从主机传递到托管的 blazor wasm 应用程序?

asp.net-core - 在 ASP.NET Core 中使用 ValidationMessage 时,我可以添加或更改默认的 CSS 类吗?