指定DataAnnotationsValidator应该验证哪些属性

时间:2020-04-27 14:10:08

标签: blazor

我有一个带有EditFormDataAnnotationsValidator的剃须刀组件。表单具有一个属性的输入字段,但是我的模型具有两个必需的属性。是否可以确切指定应验证的属性?我当然可以在代码中为属性分配一个值,但最好避免这种情况。

我的代码如下:

@page "/counter"

<EditForm EditContext="@_editContext">

    <DataAnnotationsValidator />
    <ValidationSummary />
    <div class="form-group">
        <label class="control-label">Name:</label>
        <InputText @bind-Value="_model.Name" class="form-control" />
        <ValidationMessage For="@(() => _model.Name)" />
    </div>

    <button type="submit">Submit</button>
</EditForm>

@code {

    class MyModel
    {
        [System.ComponentModel.DataAnnotations.Required]
        public string Name { get; set; }

        [System.ComponentModel.DataAnnotations.Required]
        public string Email { get; set; }
    }

    private EditContext _editContext;
    private MyModel _model = new MyModel();

    protected override void OnInitialized()
    {
        _editContext = new EditContext(_model);
    }
}

1 个答案:

答案 0 :(得分:1)

Blazor的DataAnnotations验证支持旨在与表单域和编辑上下文中的整体模型一起使用。您可以按照说明in the documentation here.

扩展验证行为

编辑 仍然可行的一种方法是 省略 <ValidationSummary />组件内的行EditForm,并保留单独的<ValidationMessage />每个表单字段。您会丢失总体摘要,但是它将起作用。

或者,您也可以将初始化方法中的Context限制为_editContext = new EditContext(_model.Name);,因此您只考虑Edit上下文中的Name属性,但是除非您还设置了{{ 1}}属性初始化为一个空字符串,如下所示:MyModel.Name。在这种情况下,您应该向public string Name { get; set; } = "";添加另一个数据注释以指定最小长度,以确保用户仍然必须输入内容。

也许更大的问题是是否需要电子邮件地址,为什么不也以表格形式捕获它?相反,如果不需要捕获它,为什么要在模型中包括它?

此用例的一个更简单的选择是将模型限制为直接使用的模型。如果确实需要绕过Email属性的验证,请记住,用来装饰属性的Name旨在用于某种形式的验证。您最好在此表单的上下文中使用数据传输对象,使其仅捕获当前所需的 ,例如Name属性,然后将其适当地分配给更大的模型验证后,请通过编程的Set方法进行操作,而不是通过运行验证的方法。当然,这违背了注释起初的目的,因此请思考一下什么才是最有意义的。随你(由你决定。