我的剃须刀组件带有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);
}
}
Blazor的DataAnnotations验证支持旨在与表单字段和编辑上下文中的整体模型一起使用。您可以按照说明in the documentation here.
扩展验证行为或者,您也可以将初始化方法中的Context限制为_editContext = new EditContext(_model.Name);
,因此您只考虑编辑上下文中的Name属性,但是除非您将MyModel.Name
属性设置为初始化为空字符串,如下所示:public string Name { get; set; } = "";
。在这种情况下,您应该在Name
中添加另一个数据注释以指定最小长度,以确保用户仍然必须输入内容。
也许更大的问题是,是否需要电子邮件地址,为什么不也以表格形式捕获它?相反,如果您不需要捕获它,为什么要在模型中包括它?
此用例的一个更简单的选择是将模型限制为直接使用的模型。如果确实必须绕过Email属性的验证,请记住,用来装饰属性的DataAnnotations
设计为可用于某种形式的验证。您最好在此表单的上下文中使用数据传输对象,使其仅捕获当前所需的only,例如Name属性,然后根据需要通过编程将其分配给更大的模型验证后设置方法,而不是运行验证的方法。当然,这违背了注释起初的目的,因此请思考一下什么才是最有意义的。随你(由你决定。