当前位置: 首页 > article >正文

Blazor-表单提交的艺术:如何优雅地实现 (下)

在上一章节中我们使用HTML的方式介绍了如何在Blazor框架下进行表单的提交,而在Blazor框架中也为我们内置了<EditForm>组件来代替原始的HTML,<form>,下面我们将对<EditForm>的用法进行讲解,并将两种表单方式进行对比,为大家提供使用的建议。

交互式SSR访问

@page "/SSREditForm"
<h3>SSREditForm</h3>
@rendermode InteractiveServer
<EditForm Model="Model" OnSubmit="Submit"><div class="mb-3 w-25"><label for="name" class="form-label">姓名:</label><InputText @bind-Value="Model.Name" class="form-control" placeholder="请输入姓名" /></div><div class="mb-3 w-25"><label for="age" class="form-label">年龄:</label><InputNumber @bind-Value="Model.Age" class="form-control" placeholder="请输入年龄" /></div><div class="mb-3 w-25"><button type="submit" class="btn btn-primary">提交</button></div>
</EditForm>
@code {//页面模型public User Model { get; set; } = new();//当用户提交窗体时,该处理程序将被调用。private void Submit(){Console.WriteLine($"输入姓名:{Model.Name}");Console.WriteLine($"输入年龄:{Model.Age}");}//模型类public class User{public string? Name { get; set; }public int Age { get; set; }}
}
  • 在组件中,必须使用 Model 属性指定一个关联的模型类.
  • 在组件中,使用Model="Model"关联表单模型,以向表单提供绑定的属性。
  • 在组件中,使用OnSubmit="Submit"指定将表单提交到Submit()方法中。
    在这里插入图片描述

静态SSR访问

静态 SSR 中,不能使用事件处理程序,所以要以 HTTP 的方式提交表单
需要使用POST访问,并指定@formname,对应的表单接收类需要使用特性进行接收,其他方面与交互式SSR一致

[SupplyParameterFromForm(FormName = "StaticSSREditForm")]
public User Model { get; set; } = new();
@page "/SSREditForm"
<h3>SSREditForm</h3>
@rendermode InteractiveServer
<EditForm Model="Model" OnSubmit="Submit" method="post" FormName="StaticSSREditForm"><div class="mb-3 w-25"><label for="name" class="form-label">姓名:</label><InputText @bind-Value="Model.Name" class="form-control" placeholder="请输入姓名" /></div><div class="mb-3 w-25"><label for="age" class="form-label">年龄:</label><InputNumber @bind-Value="Model.Age" class="form-control" placeholder="请输入年龄" /></div><div class="mb-3 w-25"><button type="submit" class="btn btn-primary">提交</button></div>
</EditForm>
@code {//页面模型[SupplyParameterFromForm(FormName = "StaticSSREditForm")]public User Model { get; set; } = new();//当用户提交窗体时,该处理程序将被调用。private void Submit(){Console.WriteLine($"输入姓名:{Model.Name}");Console.WriteLine($"输入年龄:{Model.Age}");}//模型类public class User{public string? Name { get; set; }public int Age { get; set; }}
}

<EditForm> 与 原生<form>比对

组件集成

<EditForm>中可以使用内置的Razor组件,提供了更加便捷的操作特性
<form>中无法使用内置的Razor组件

数据绑定

<EditForm>

  • 直接绑定 C# 模型对象(通过 Model 或 EditContext 参数)。
  • 支持双向数据绑定(如 组件自动同步数据)。

<form>

  • 需手动处理数据绑定(通过 @bind 或 JavaScript 互操作)。
  • 提交时需手动从输入字段提取数据。

验证机制

<EditForm>

  • 内置声明式验证(集成 DataAnnotations)。
  • 支持组件如 <DataAnnotationsValidator>、<ValidationSummary>。

<form>

  • 需手动实现验证逻辑(C# 或 JavaScript)。
  • 依赖 HTML5 原生验证(如 required),但无法与 Blazor状态深度集成。

事件处理

<EditForm>

提供专用事件:- OnValidSubmit:验证通过时触发。 - OnInvalidSubmit:验证失败时触发。 OnSubmit:自定义提交逻辑。

<form>

  • 需手动实现验证逻辑(C# 或 JavaScript)。
  • 依赖 HTML5 原生验证(如 required),但无法与 Blazor状态深度集成。

渲染与性能

<EditForm>

在 Blazor 渲染生命周期内工作,避免整页刷新(SPA 体验)。

自动管理 UI 更新(如验证错误消息)。

<form>

默认整页刷新(破坏 SPA 体验),除非显式阻止。

需手动更新 UI 状态(如显示错误信息)。

http://www.lryc.cn/news/2402577.html

相关文章:

  • 五子棋网络对战游戏的设计与实现设计与实现【源码+文档】
  • Vue基础(14)_列表过滤、列表排序
  • Spring Boot项目中JSON解析库的深度解析与应用实践
  • 我用Amazon Q写了一个Docker客户端,并上架了懒猫微服商店
  • Django CMS 的 Demo
  • 在 UE5 蓝图中配置Actor类型的Asset以作为位置和旋转设置目标
  • Android 之 kotlin 语言学习笔记四(Android KTX)
  • 适用于vue3的大屏数据展示组件库DataV(踩坑版)
  • mysql实现分页查询
  • Flink checkpoint
  • 【java】在springboot中实现证书双向验证
  • CppCon 2015 学习:Functional Design Explained
  • 基于3D对象体积与直径特征的筛选
  • GIT - 如何从某个分支的 commit创建一个新的分支?
  • Claude vs ChatGPT vs Gemini:功能对比、使用体验、适合人群
  • 线程基础编程
  • DJango项目
  • 深入了解JavaScript当中如何确定值的类型
  • excel数据对比找不同:6种方法核对两列数据差异
  • 基于智能代理人工智能(Agentic AI)对冲基金模拟系统:模范巴菲特、凯西·伍德的投资策略
  • MySQL数据库基础(二)———数据表管理
  • 如何在Lyra中创建一个新的Game Feature Plugin和Experience游戏体验
  • RDMA简介5之RoCE v2队列
  • SAFe/LeSS/DAD等框架的核心适用场景如何选择?
  • 鸿蒙应用开发之uni-app x实践
  • window查看SVN账号密码
  • Python训练营---Day44
  • 前端项目初始化
  • USB扩展器与USB服务器的2个主要区别
  • 第46节:多模态分类(图像+文本)