【问题标题】:Can we check which property fails validation in Blazor?我们可以检查 Blazor 中哪个属性未通过验证吗?
【发布时间】:2020-12-14 09:04:42
【问题描述】:

我有一个 Blazor 组件,它包含一个表单输入和一些额外的标记。感谢@enet 的一些出色帮助(请参阅this answer),我现在有了它,如果模型属性的验证失败,<ValidationMessage> 会正确显示消息。

但是,我希望这个<ValidationMessage> 标记被HTML 包围,该标记仅在显示验证消息时出现,即当该属性的验证失败时。我可以通过引入私人bool 来做到这一点,并按如下方式使用它...

    @if (_showValidationMsg) {
      <div class="input-group-append"><label class="input-group-text has-error" for="@PropertyName">
        <ValidationMessage For="@ValueExpression" /></label>
      </div>
    }

@code {
  // other stuff here as well

  private bool _showValidationMsg = false;

  private async Task OnChanged(ChangeEventArgs cea) {
    await ValueChanged.InvokeAsync(cea.Value?.ToString() ?? "");
    FieldIdentifier identifier = CascadedEditContext.Field(PropertyName);
    CascadedEditContext.NotifyFieldChanged(identifier);
    _showValidationMsg = !CascadedEditContext.Validate();
  }

}

当组件只有一个输入元素,但我的一个组件有两个输入控件时,这很好用,我想知道哪一个未通过验证,因此我可以显示/隐藏正确的 HTML 位。

有没有办法找出哪些模型属性验证失败?

【问题讨论】:

  • Shalom,您是否意识到只要不触发 OnChanged 方法,ValidationMessage 就会保持不可见,尽管它应该与要求用户输入值的消息一起显示。当您单击“保存”按钮而不在字段中输入值时会发生这种情况。我会想办法解决的……

标签: blazor


【解决方案1】:

一旦您调用了CascadedEditContext.Validate(您可以忽略结果,因为您不需要它,见下文),然后您可以使用GetValidationMessages 来获取属性的验证消息。如果没有,则通过验证。

使用您的代码作为基础,您可以将其包装成一个可重用的方法,如下所示...

private async Task<bool> CheckValidationFor(ChangeEventArgs cea, EventCallback<string> valueChangedEventCallback, string propertyName) {
  await valueChangedEventCallback.InvokeAsync(cea.Value?.ToString() ?? "");
  FieldIdentifier identifier = CascadedEditContext.Field(propertyName);
  CascadedEditContext.NotifyFieldChanged(identifier);
  CascadedEditContext.Validate();
  return CascadedEditContext.GetValidationMessages(identifier).Any();

}

然后您可以将您的 OnChanged1 代码简化为...

private async Task OnChanged1(ChangeEventArgs cea) =>
  _showValidationMsg1 = await CheckValidationFor(cea, Value1Changed, PropertyName1);

OnChanged2 也是如此

【讨论】:

  • 谢谢,太棒了!
猜你喜欢
  • 1970-01-01
  • 2021-12-19
  • 1970-01-01
  • 2011-04-12
  • 1970-01-01
  • 2018-03-08
  • 2011-01-21
  • 2018-05-03
  • 2020-07-27
相关资源
最近更新 更多