我有一个 Blazor 组件,它包含表单输入和一些额外的标记。感谢 @enet 的一些出色帮助(请参阅 this answer ),我现在有了它,如果模型属性的验证失败, <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
也是如此
关于blazor - 我们可以检查 Blazor 中哪些属性未通过验证吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65277958/