Blazor 指定DataAnnotationsValidator应验证的属性

Blazor 指定DataAnnotationsValidator应验证的属性,blazor,Blazor,我有一个razor组件,带有EditForm和DataAnnotationsValidator。表单有一个属性的输入字段,但我的模型有两个必需的属性。是否可以精确指定应验证的属性?我当然可以在代码中为属性赋值,但最好避免这样做 我的代码如下所示: @page "/counter" <EditForm EditContext="@_editContext"> <DataAnnotationsValidator /> <ValidationSumma

我有一个razor组件,带有
EditForm
DataAnnotationsValidator
。表单有一个属性的输入字段,但我的模型有两个必需的属性。是否可以精确指定应验证的属性?我当然可以在代码中为属性赋值,但最好避免这样做

我的代码如下所示:

@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);
    }
}
@page”/counter
姓名:
提交
@代码{
类MyModel
{
[System.ComponentModel.DataAnnotations.Required]
公共字符串名称{get;set;}
[System.ComponentModel.DataAnnotations.Required]
公共字符串电子邮件{get;set;}
}
私有EditContext_EditContext;
私有MyModel_model=新MyModel();
受保护的覆盖无效OnInitialized()
{
_editContext=新的editContext(_模型);
}
}

Blazor的DataAnnotations验证支持设计用于编辑上下文中的表单字段和整体模型。您可以按照说明扩展验证行为

编辑 一种仍然有效的方法是
EditForm
组件中省略
行,并为每个表单字段保留单独的
。您失去了总体摘要,但它会起作用

或者,您也可以将初始化方法中的上下文限制为
\u editContext=new editContext(_model.Name)
因此您只在编辑上下文中考虑Name属性,但是这将引发空引用异常,除非您还将
MyModel.Name
属性设置为空字符串,如下所示:
公共字符串名称{get;set;}=“”。在这种情况下,您应该向
Name
添加另一个数据注释,以指定最小长度,以确保用户仍然需要输入一些内容

也许更大的问题是,如果需要电子邮件地址,为什么不在表单中捕获它?相反,如果不需要捕获它,为什么要将其包含在模型中


对于这个用例,一个更简单的选择是将您的模型限制为您直接使用的模型。如果您真的必须绕过电子邮件属性的验证,请记住,您正在装饰属性的
DataAnnotations
设计用于某种形式的验证。您最好在此表单的上下文中使用一个数据传输对象,该对象只捕获此时所需的内容,例如Name属性,然后在验证后通过编程集方法将其分配给一个更大的模型,而不是运行验证的对象。这当然违背了注释的初衷,所以请思考一下什么是最有意义的。这取决于你

出现此问题的一个场景是,当数据库中的数据模型包含在UI中不可见的信息时。用户还可以使用不同的表单编辑数据模型的各个部分。创建多个模型将解决此问题,但这也将创建新模型,如您所述:-/Understand。我添加了一个编辑,您可能已经尝试过或不想使用,但为了获得完整的答案,我认为我应该添加它。