Blazor:验证复杂类型

Har*_*rry 6 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; }

}
Run Code Online (Sandbox Code Playgroud)

然后我有一个如下所示的表单片段:

<TextInput @bind-Value="Input.DirectProperty" />
<TextInput @bind-Value="Input.Feature.NestedProperty />
Run Code Online (Sandbox Code Playgroud)

我想查看来自直接属性和嵌套属性的验证消息。它不适用于DataAnnotationsValidator.

我从直接属性中看到验证问题,但从嵌套属性中没有看到验证问题。但真正邪恶的是——有时我会从嵌套的消息中收到验证消息。只是有时,而不是在尝试使用提交按钮实际提交表单时。好的,它是可重现的:我输入一个有效值并按 Enter,我输入一个无效值并按 Enter 或 Tab。然后我会看到该消息,直到单击“提交”按钮。这种行为是疯狂的、出乎意料的和随机的。

所以微软的解决方案来了,来看看一个奇怪而特殊的包:

<PackageReference Include="Microsoft.AspNetCore.Blazor.DataAnnotations.Validation" Version="3.1.0-preview4.19579.2" />
Run Code Online (Sandbox Code Playgroud)

您不会在 Visual Studio 的 NuGet 面板中搜索它。它可能未被微软列出。

但是,有一个(当前?)文档指向它: https://learn.microsoft.com/en-us/aspnet/core/blazor/forms-validation ?view=aspnetcore-3.1

搜索文本“ValidateComplexType”或“ObjectGraphDataAnnotationsValidator”。

是的,他们承认它是实验性的,但首先 - 没有更新的版本,然后再说一次,它未列出。AFAIK 这是一个原因。

原因是它没有按预期工作,特别是在升级其他软件包之后。

首先,它似乎有效。我的嵌套属性已得到验证,那么问题出在哪里呢?单击几次后,我发现相同的随机行为,但这一次 - 我收到重复的验证消息。因此,第一种方法的意外随机行为会在另一个验证器中显现出来。

为了消除随机性并恢复理智的验证行为,我必须展平输入模型的层次结构。然后——就不会发生任何随机的事情。验证就可以了。问题是 - 我的应用程序有许多非常大且复杂的表单。我将不得不重写其中的很大一部分,以使随机行为消失。

ObjectGraphAnnotationValidator因此,这是一个严重的大问题: Blazor没有官员是有原因的吗?也许以 Blazor 形式验证复杂对象的问题太难解决?

我现在不知道该怎么办。研究如何制作我自己的ObjectGraphAnnotationValidator,或重写我的应用程序中的所有输入模型?选项A是一个兔子洞。我担心我会花几个小时在上面并再次得到某种随机行为。选项 B 需要几个小时,但应该可行。那么,你会怎么做?进行复杂类型验证,还是放弃它,因为它今年在 Blazor 中不可用,明年也可能不可用?