开拓者:ValidateComplexType

时间:2020-10-07 15:23:57

标签: blazor blazor-server-side

在我的实际应用程序中,我的表单非常复杂。实际上-许多使用复杂数据的复杂表格。在多个地方使用了不同的零件,这些零件具有我的表单所需的属性。所以看起来像这样:

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中也可能在明年不可用?

1 个答案:

答案 0 :(得分:1)

您可能会考虑在Blazor中结合Blazored.FluentValidation使用FluentValidation。

有关更多信息,请参见Chris Sainty's blog post