呈现EditForm组件时,Blazor将输出HTML<form>元素。由于这是一个标准的Web控件,我们可以通过添加type="submit"<input>来为用户提供提交表单的能力。

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

Blazor将拦截来自form的提交事件,并将它们路由回我们的razor视图。EditForm上有三个事件与表单深渊翻滚相关。

  • OnValidSubmit
  • OnInvalidSubmit
  • OnSubmit

这些事件中的每个事件都传递一个EditContext作为参数,我们可以使用该参数来确定用户输入的状态。

注意:我们不能使用这些事件中的任何一个,也不能使用这些事件中的一个。我们可以使用两个事件的唯一情况是同时设置OnValidSubmitOnInvalidSubmit。如果设置了OnSubmit,则这两个事件都不能使用。

OnValidSubmit / OnInvalidSubmit

更改上述源代码后,我们可以通过在EditForm中声明OnValidSubmitOnInvalidSubmit事件来订阅它们。

  1. @if (LastSubmitResult != null)
  2. {
  3. <h2>
  4. Last submit status: @LastSubmitResult
  5. </h2>
  6. }
  7. <EditForm Model=@Person OnValidSubmit=@ValidFormSubmitted OnInvalidSubmit=@InvalidFormSubmitted>
  8. <DataAnnotationsValidator/>
  9. other html mark-up here
  10. <input type="submit" class="btn btn-primary" value="Save" />
  11. </EditForm>
  12. @code {
  13. Person Person = new Person();
  14. string LastSubmitResult;
  15. void ValidFormSubmitted(EditContext editContext)
  16. {
  17. LastSubmitResult = "OnValidSubmit was executed";
  18. }
  19. void InvalidFormSubmitted(EditContext editContext)
  20. {
  21. LastSubmitResult = "OnInvalidSubmit was executed";
  22. }
  23. }

OnSubmit

无论表单是否通过验证,都会在提交表单时执行OnSubmit事件。可以通过执行editContext.Validate()来检查表单的有效性状态,如果表单有效,则返回true;如果表单无效(存在验证错误),则返回false

  1. @if (LastSubmitResult != null)
  2. {
  3. <h2>
  4. Last submit status: @LastSubmitResult
  5. </h2>
  6. }
  7. <EditForm Model=@Person OnSubmit=@FormSubmitted>
  8. <DataAnnotationsValidator/>
  9. other html mark-up here
  10. <input type="submit" class="btn btn-primary" value="Save" />
  11. </EditForm>
  12. @code {
  13. Person Person = new Person();
  14. string LastSubmitResult;
  15. void FormSubmitted(EditContext editContext)
  16. {
  17. bool formIsValid = editContext.Validate();
  18. LastSubmitResult =
  19. formIsValid
  20. ? "Success - form was valid"
  21. : "Failure - form was invalid";
  22. }
  23. }

Blazor validation limitations 验证限制

对于所有属性都是简单类型的简单表单,验证工作正常。但是,当我们的EditForm.Model具有复杂类型的属性时,例如我们示例中的Person类具有属于Address类型的HomeAddress属性,则除非用户编辑子属性,否则不会验证子属性。
下面的屏幕截图显示了上例中的editContext.Validate()如何返回true以指示表单有效,即使Address.LineAddress.PostalCode都用[Required]DataAnnotation属性修饰。
Handling form submission - 图1
我们实际想要的行为将产生如下屏幕截图所示的用户体验。
image.png