我们可以检查Blazor中哪个属性未通过验证吗?

我们可以检查Blazor中哪个属性未通过验证吗?,blazor,Blazor,我有一个Blazor组件,它保存一个表单输入和一些额外的标记。多亏@enet(请参阅)提供了一些出色的帮助,我现在拥有了它,这样,如果模型属性的验证失败,将正确显示消息 但是,我想让这个标记被HTML包围,它只在显示验证消息时出现,即当该属性的验证失败时出现。我可以通过引入一个私有的bool,并按如下方式使用它来做到这一点 @if (_showValidationMsg) { <div class="input-group-append">&l

我有一个Blazor组件,它保存一个表单输入和一些额外的标记。多亏@enet(请参阅)提供了一些出色的帮助,我现在拥有了它,这样,如果模型属性的验证失败,
将正确显示消息

但是,我想让这个
标记被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();
  }

}
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();
@if(\u showValidationMsg){
}
@代码{
//这里还有其他东西
私有bool\u showValidationMsg=false;
已更改专用异步任务(ChangeEventArgs cea){
wait ValueChanged.InvokeAsync(cea.Value?.ToString()??“”);
FieldIdentifier标识符=CascadedItContext.Field(PropertyName);
CascadedItContext.NotifyFieldChanged(标识符);
_showValidationMsg=!cascadedItContext.Validate();
}
}
当组件只有一个输入元素,但我的一个组件有两个输入控件,我想知道哪一个没有通过验证,这样我就可以显示/隐藏正确的HTML


是否有办法找出哪些模型属性未通过验证?

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

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

    @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();
  }

}
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();

同样地,对于
OnChanged2

谢谢,太棒了!Shalom,您是否意识到,只要OnChanged方法未被激发,ValidationMessage将保持不可见,尽管它应该与要求用户输入值的消息一起显示。当您单击“保存”按钮而不在字段中输入值时,会发生这种情况。我会试着想出一个解决办法。。。