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

news2025/7/23 3:41:11

在上一章节中我们使用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.coloradmin.cn/o/2402577.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

五子棋网络对战游戏的设计与实现设计与实现【源码+文档】

五子棋网络对战游戏的设计与实现 摘 要 在现代社会中,及其它无线设备越来越多的走进普通老百姓的工作和生活。随着3G技术的普及与应用&#xff0c;基于Java开发的软件在上的使用非常的广泛&#xff0c;增值服务的内容也是越来越多&#xff0c;对丰富人们的生活内容、提供快…

Vue基础(14)_列表过滤、列表排序

Array.prototype.filter()【ES5】 filter() 方法创建给定数组一部分的浅拷贝&#xff0c;其包含通过所提供函数实现的测试的所有元素。 语法&#xff1a; filter(callbackFn) filter(callbackFn, thisArg) 参数&#xff1a; callbackFn(回调函数)&#xff1a;为数组中的每个元…

Spring Boot项目中JSON解析库的深度解析与应用实践

在现代Web开发中&#xff0c;JSON&#xff08;JavaScript Object Notation&#xff09;作为轻量级的数据交换格式&#xff0c;已成为前后端通信的核心桥梁。Spring Boot作为Java生态中最流行的微服务框架&#xff0c;提供了对多种JSON库的无缝集成支持。本文将深入探讨Spring B…

我用Amazon Q写了一个Docker客户端,并上架了懒猫微服商店

自从接触了Amazon Q&#xff0c;我陆陆续续写了不少小软件&#xff0c;其中这个项目是一个典型的例子&#xff0c;自己平时来使用&#xff0c;也分享给一些 NAS 爱好者来用。 故事还要用上次折腾黑群晖说起&#xff0c;本意想把 NAS 和打印机共享二合一的&#xff0c;所以把闲着…

Django CMS 的 Demo

以下是关于 Django CMS 的 Demo 示例及相关资源的整理 安装与运行 Django CMS 示例 使用 djangocms-installer 快速创建 Django CMS 项目&#xff1a; pip install django_cms djangocms -p . mysite安装记录 pip install django-cms Looking in indexes: https://pypi.tun…

在 UE5 蓝图中配置Actor类型的Asset以作为位置和旋转设置目标

目标 UE5的蓝图的事件图表里面&#xff0c;有一个模块&#xff08;节点&#xff09;如图&#xff0c;这是一个设置Actor的location和rotation量的模块&#xff0c;其中需要接收一个Target作为输入&#xff0c;这个Target应该就是一个在map中具备location和rotation信息的实例化…

适用于vue3的大屏数据展示组件库DataV(踩坑版)

踩坑版 如果按照官网(https://datav-vue3.jiaminghi.com/)的vue3安装有问题 官网是将dataview/datav-vue3 安装为本地依赖 npm install dataview/datav-vue31、跑起来报错&#xff08;报错信息忘记保留了&#xff09; 有人说找到node_modules&#xff0c; 安装成功后会有这个…

基于3D对象体积与直径特征的筛选

1&#xff0c;目的 筛选出目标3D对象。 效果如下&#xff1a; 2&#xff0c;原理 使用3D对象的体积与直径特征进行筛选。 3&#xff0c;代码解析 3.1&#xff0c;预处理2.5D深度图。 * 参考案例库&#xff1a;select_object_model_3d.hdev * ****************************…

DJango项目

一.项目创建 在想要将项目创键的目录下,输入cmd (进入命令提示符)在cmd中输入:Django-admin startproject 项目名称 (创建项目)cd 项目名称 (进入项目)Django-admin startapp 程序名称 (创建程序)python manage.py runserver 8080 (运行程序)将弹出的网址复制到浏览器中…

excel数据对比找不同:6种方法核对两列数据差异

工作中&#xff0c;有时需要核对两列数据的差异&#xff0c;用于对比、复核等。数据较少的情况下差异肉眼可见&#xff0c;数据量较大时用什么方法比较好呢&#xff1f;从个人习惯出发&#xff0c;我整理了6种方法供参考。 6种方法核对两列数据差异&#xff1a; 1、Ctrl G定位…

基于智能代理人工智能(Agentic AI)对冲基金模拟系统:模范巴菲特、凯西·伍德的投资策略

股票市场涉及众多统计数据和模式。股票交易基于研究和数据驱动的决策。人工智能的使用可以实现流程自动化&#xff0c;让投资者在研究上花费更少的时间&#xff0c;同时提高准确性。这使他们能够更加专注于监督实际交易和服务客户。 顶尖对冲基金经理发挥着至关重要的作用&…

MySQL数据库基础(二)———数据表管理

前言 上篇文章介绍了MySQL数据库以即数据库的管理 这篇文章将给大家讲解数据表的管理 一、数据表常见操作 数据表常见操作的指令 进入数据库use数据库&#xff1b; 查看当前所有表&#xff1a;show tables; 创建表结构 1.创建表操作 1.1创建表 create table 表名(列名 …

RDMA简介5之RoCE v2队列

在RoCE v2协议中&#xff0c;RoCE v2队列是数据传输的最底层控制机制&#xff0c;其由工作队列&#xff08;WQ&#xff09;和完成队列&#xff08;CQ&#xff09;共同组成。其中工作队列采用双向通道设计&#xff0c;包含用于存储即将发送数据的发送队列&#xff08;SQ&#xf…

SAFe/LeSS/DAD等框架的核心适用场景如何选择?

在敏捷开发的规模化实践中&#xff0c;SAFe&#xff08;Scaled Agile Framework&#xff09;、LeSS&#xff08;Large Scale Scrum&#xff09;和DAD&#xff08;Disciplined Agile Delivery&#xff09;是三大主流框架。它们分别以不同的哲学和方法论应对复杂性、协作与交付的…

window查看SVN账号密码

背景 公司的SVN地址发生迁移&#xff0c;想迁移一下本地SVN地址&#xff0c;后来发现SVN账号密码忘记了。写此文章纯记录。 迁移SVN地址&#xff1a; 找到svn目录点击relocate&#xff0c;输入新的svn地址&#xff0c;如需输入账号密码&#xff0c;输入账号密码即完成svn地址…

前端项目初始化

​​​​​​ 目录 1. 安装 nvm 2. 配置 nvm 并切换到 Node.js 16.15.0 3. 安装 LightProxy 代理 4. GIT安装 1. 配置用户名和邮箱&#xff08;这些信息将用于您在提交代码时的标识&#xff09;&#xff1a; 2. 生成SSH密钥&#xff08;用于将本地代码仓库与远程存储库连…

USB扩展器与USB服务器的2个主要区别

在现代办公和IT环境中&#xff0c;连接和管理USB设备是常见需求。USB扩展器&#xff08;常称USB集线器&#xff09;与USB服务器&#xff08;如朝天椒USB服务器&#xff09;是两类功能定位截然不同的解决方案。前者主要解决物理接口数量不足的“近身”连接扩展问题&#xff0c;而…

第46节:多模态分类(图像+文本)

一、多模态分类概述 多模态分类是指利用来自不同模态(如图像、文本、音频等)的数据进行联合分析和分类的任务。 在当今大数据时代,信息往往以多种形式存在,例如社交媒体上的图片配文字、视频附带字幕、医疗检查中的影像与报告等。单一模态的数据往往只能提供有限的信息,…

springMVC-10验证及国际化

验证 概述 ● 概述 1. 对输入的数据(比如表单数据)&#xff0c;进行必要的验证&#xff0c;并给出相应的提示信息。 2. 对于验证表单数据&#xff0c;springMVC提供了很多实用的注解, 这些注解由JSR303 验证框架提供. ●JSR 303 验证框架 1. JSR 303 的含义 JSR&#xff0…

LRU 和 DiskLRU实现相册缓存器

我是写Linux后端的&#xff08;golang、c、py&#xff09;&#xff0c;后端缓存算法通常是指的是内存里面的lru、或diskqueue&#xff0c;都是独立使用。 很少有用内存lru与disklru结合的场景需求。近段时间研究android开发&#xff0c;里面有一些设计思想值得后端学习。 写这…