【问题标题】:Blazor validation over a MongoDB Datamodel基于 MongoDB 数据模型的 Blazor 验证
【发布时间】:2026-02-03 06:20:04
【问题描述】:

我尝试将我的 MongoDB 类模型链接到我的 Blazor 页面组件。我试图将所有 System.ComponentModel.DataAnnotations.ValidationAttribute 保留到一个接口,并让带有 Bson 装饰的“真实”类分开:

public interface ITestIt
{
    int id { get; set; }

    [Required(ErrorMessage = "Material cost is required")]
    [StringLength(5, ErrorMessage = "Name is too long.")]
    string MyName { get; set; }
}

public class TestIt : ITestIt
{
    [BsonId]
    public int id { get; set; }
    public string MyName { get; set; }

}

并将其包含在我的页面中:

<h1>Hello, world!</h1>

Welcome to your new app.

<EditForm Model=@testIt OnValidSubmit="HandleValidSubmit">
    <DataAnnotationsValidator />
    <ValidationSummary />
    <div class="form-group">
        <label for="Name">Name</label>
        <InputText @bind-Value=testIt.MyName class="form-control" id="Name" />
        <ValidationMessage For="() => testIt.MyName" Description="Salut" />
    </div>
    <input type="submit" class="btn btn-primary" value="Save" />
</EditForm>



@code{

    private ITestIt testIt;
    private bool IsDone = false;

    protected override async Task OnInitializedAsync()
    {
        if (IsDone) return;

        testIt = new TestIt();
        IsDone = true;
    }

    private void HandleValidSubmit()
    {
        Console.WriteLine("OnValidSubmit");
    }

但是它不起作用,将两者分开的最佳方法是什么,而不必用 DataAnnotations 标签装饰我的所有数据模型,也不必将每个属性一个一个地复制到另一个对象?

谢谢!

【问题讨论】:

    标签: mongodb validation blazor datamodel


    【解决方案1】:

    我不认为 Blazor 反映了接口的数据注释,只反映了实现对象的属性。

    我将验证完全保存在一个单独的项目中。为此,我使用 FluentValidation。

    您可以编写一个接受EditContext 作为级联参数的组件,挂钩到它请求验证的事件,然后执行 FluentValidation 代码。

    或者您可以使用预制库,例如https://www.nuget.org/packages/PeterLeslieMorris.Blazor.FluentValidation/

    【讨论】:

    • 我在研究中看到了很多。我会看看。我的另一种方法是在具有相同结构的两个不同类上使用序列化克隆。但是我们必须不断更新两个数据模型。这是将规则集成到类而不是 UI 输入中的验证设计缺陷......
    • asp.net 验证是否在接口上查找数据注释?
    • 我做过的所有测试,答案都是NO...只在小学...
    • 我测试了你建议的那个:PeterLeslieMorris,我发现了另一个:github.com/ryanelian/FluentValidation.Blazor他很简单,工作起来像一个魅力......
    • 我找到了更完整的fluentvalidation.net