blazor - 我们可以检查 Blazor 中哪个属性未通过验证吗?
问题描述
我有一个 Blazor 组件,它包含一个表单输入和一些额外的标记。感谢@enet 的一些出色帮助(请参阅此答案),我现在有了它,这样如果模型属性的验证失败,则<ValidationMessage>
正确显示消息。
但是,我希望这个<ValidationMessage>
标签被 HTML 包围,它只在显示验证消息时出现,即当该属性的验证失败时。我可以通过引入 private 来做到这一点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 位。
有没有办法找出哪些模型属性验证失败?
解决方案
一旦你调用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
推荐阅读
- javascript - 我可以从另一个变量中分配一个变量而不改变它在 JavaScript 中的值吗?
- mysql - 无法更新root Mysql密码
- css - 如何将 css 类添加到故事书中的反应组件中?
- php - 使用 Api 平台在 POST 请求上创建具有关系的实体
- css - ASP.NET MVC 5 缓存 CSS 和 JS 文件
- amazon-web-services - Spinnaker Clouddriver pod 转到 CrashLoopBackOff
- git - 在推送到远程版本控制之前检查以确保项目编译
- visual-studio-code - 更改哪些键或字符触发 vscode 自动完成
- r - 使用因子进行固定效应回归时的内存问题
- javascript - 为什么我不能在我的 React 应用程序中使用“npm start”?