我有一个带有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);
}
}
答案 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方法进行操作,而不是通过运行验证的方法。当然,这违背了注释起初的目的,因此请思考一下什么才是最有意义的。随你(由你决定。