DataAnnotationsValidator是Blazor中的标准验证器类型。在EditForm组件中添加此组件将启用基于从System.ComponentModel.DataAnnotations.ValidationAttribute派生的.NET属性的表单验证。
首先,我们将创建一个简短的示例,然后我们将了解幕后发生的事情。首先,创建一个我们可以编辑的模型,并使用一些用于验证的数据注释来修饰其属性。

  1. public class Person
  2. {
  3. [Required]
  4. public string Name { get; set; }
  5. [Range(18, 80, ErrorMessage = "Age must be between 18 and 80.")]
  6. public int Age { get; set; }
  7. }
  • 第3行指定Name属性不能为Null或空。
  • 第5行指定了Age属性的有效值范围(从18到80),还提供了要向用户显示的适当错误消息。

    Adding validation

    在默认的Blazor应用程序中编辑Index.razor页面,并提供一些标记来编辑Person实例。 ```csharp

@code { Person Person = new Person(); }

  1. 现在运行该应用程序将导致向用户呈现一个不验证其输入的表单。为了确保表单通过验证,我们必须指定验证机制。在`EditForm`组件内添加`DataAnnotationsValidator`组件。
  2. ```csharp
  3. <EditForm Model=@Person>
  4. <DataAnnotationsValidator/>
  5. <div class="form-group">
  6. <label for="Name">Name</label>
  7. <InputText @bind-Value=Person.Name class="form-control" id="Name" />
  8. </div>
  9. <div class="form-group">
  10. <label for="Age">Age</label>
  11. <InputNumber @bind-Value=Person.Age class="form-control" id="Age" />
  12. </div>
  13. <input type="submit" class="btn btn-primary" value="Save"/>
  14. </EditForm>

运行应用程序并单击保存按钮将更新用户界面,以提供用户输入中存在错误的可视指示。
image.png

Displaying validation error messages

验证错误消息可以通过两种方式显示给用户。我们可以添加ValidationSummary来显示表单中所有错误的综合列表。我们还可以使用ValidationMessage组件来显示表单上特定输入的错误消息。这些组件不是互斥的,因此可以同时使用这两个组件。
在我们的标记中,可以简单地将ValidationSummary组件拖放到EditForm中;根本不需要额外的参数。
image.png
ValidationMessage组件显示单个字段的错误消息时,它要求我们指定该字段的标识。为了确保参数的值在重构后保持正确(例如,当我们重构Person类的属性名称时),Blazor要求我们在标识字段时指定一个表达式。为命名的参数在ValidationMessage上定义如下:

  1. [Parameter]
  2. public Expression<Func<T>> For { get; set; }

这意味着要指定我们应该使用的lambda表达式的字段标识,该表达式可以用“引号”表示,也可以用@(...)括起来。

  • Quoted form
    <ValidationMessage For="() => Person.Name"/>
  • Razor expression form
    <ValidationMessage For=@( () => Person.Name )/>

这两种形式是等价的。引用的形式更易于阅读,而剃刀表达式使其他开发人员更清楚地看到,我们定义的是表达式而不是字符串。

  1. @page "/"
  2. @using Models
  3. <EditForm Model=@Person>
  4. <DataAnnotationsValidator/>
  5. <ValidationSummary/>
  6. <div class="form-group">
  7. <label for="Name">Name</label>
  8. <InputText @bind-Value=Person.Name class="form-control" id="Name" />
  9. <ValidationMessage For="() => Person.Name"/>
  10. </div>
  11. <div class="form-group">
  12. <label for="Age">Age</label>
  13. <InputNumber @bind-Value=Person.Age class="form-control" id="Age" />
  14. <ValidationMessage For=@(() => Person.Age) />
  15. </div>
  16. <input type="submit" class="btn btn-primary" value="Save"/>
  17. </EditForm>
  18. @code {
  19. Person Person = new Person();
  20. }

image.png