在我的实际应用程序中,我的表单非常复杂。实际上-许多使用复杂数据的复杂表格。在多个地方使用了不同的零件,这些零件具有我的表单所需的属性。所以看起来像这样:
class FormData {
[ValidateComplexType]
public PropertyClass Feature { get; } = new PropertyClass();
[Required]
public string DirectProperty { get; set; }
}
class PropertyClass {
[Required]
public string NestedProperty { get; set; }
}
然后我有一个看起来像这样的表单片段:
<TextInput @bind-Value="Input.DirectProperty" />
<TextInput @bind-Value="Input.Feature.NestedProperty />
我想查看来自直接属性和嵌套属性的验证消息。
它不适用于DataAnnotationsValidator
。
我从直接属性看到验证问题,但从嵌套属性没有看到验证问题。 但是真正的邪恶是什么-有时我会从嵌套消息中获得验证消息。仅在某些情况下,并且在尝试使用“提交”按钮实际提交表单时永远不会这样做。 OK,它是可重复的:我输入一个有效值,然后按Enter,输入一个无效值,然后按Enter或Tab。然后,我看到消息,直到单击提交按钮。这种行为是疯狂,意外和随机的。
因此,Microsoft的解决方案来了,遇到了一个奇怪而特殊的软件包:
<PackageReference Include="Microsoft.AspNetCore.Blazor.DataAnnotations.Validation" Version="3.1.0-preview4.19579.2" />
您不会在Visual Studio的NuGet面板中搜索它。微软可能未将其列出。
但是,有一个(最新的)文档指向它: https://docs.microsoft.com/en-us/aspnet/core/blazor/forms-validation?view=aspnetcore-3.1
搜索文本“ ValidateComplexType”或“ ObjectGraphDataAnnotationsValidator”。
是的,他们承认它是实验性的,但是首先-没有新版本,然后再次,它未被列出。而AFAIK是这样做的原因。
原因是它无法按预期运行,尤其是在升级其他软件包之后。
首先,它似乎起作用。我对嵌套属性进行了验证,这是什么问题?单击几次后,我发现相同的随机行为,但是这次-我收到重复的验证消息。因此,第一种方法的意外随机行为会与另一个验证器一起显示。
要消除随机性并恢复理智的验证行为,我必须将输入模型的层次结构扁平化。然后-没有随机发生。验证有效。问题是-我的应用程序有很多非常大和复杂的形式。我将不得不重写其中的大部分内容,以使随机行为消失。
因此,这是一个严重的大问题:在Blazor中没有官方ObjectGraphAnnotationValidator
的原因吗?也许以Blazor形式验证复杂对象的问题太难解决了?
我现在不知道该怎么办。研究如何制作自己的ObjectGraphAnnotationValidator
,或重写应用程序中的所有输入模型?选项A是一个兔子洞。恐怕我要花几个小时才能再次得到某种随机行为。选项B将花费几个小时,但是应该可以工作。那么,你会怎么做?进行复杂的类型验证还是将其保留,因为它可能在Blazor中也可能在明年不可用?
答案 0 :(得分:1)
您可能会考虑在Blazor中结合Blazored.FluentValidation使用FluentValidation。
有关更多信息,请参见Chris Sainty's blog post。