学习ASP.NET Core Blazor编程系列六——新增图书(上)
学习ASP.NET Core Blazor编程系列二——第一个Blazor应用程序(下)
上一篇文章学习ASP.NET Core Blazor编程系列六——初始化数据中我们对数据库进行了初始化,写入了几条图书信息数据,并通过DBContext将查询到的图书信息,在列表页面中显示。通过使用@inject指令进行对象注入。
今天,这一篇文章我们来学习一下如何新增一本图书信息数据。
首先,我们在Visual Studio 20222的解决方案管理器中,鼠标右键单击“Pages”文件夹。在弹出菜单中选择,添加-->Razor组件。如下图。

其次,在弹出的“添加新项”对话框的名称输入框中输入“AddBook.razor”。然后使用鼠标左键点击“添加”按钮,将创建名为AddBook的Blazor组件。如下图。 
第三,在Visual Studio 2022的文本编辑器中打开Pages/AddBook.razor文件。
在以往经典的Web应用程序中,我们经常使用<form>元素创建表单,在表单中添加<input> 元素,<input> 有一个 type 属性,用于指定输入的类型及其显示方式(作为数字、文本框、单选按钮、复选框、按钮等),让用户输入数据,在用户提交表单时进行数据验证。如果验证成功,则可以执行相应的操作(新增,更新,删除等)。
那么Blazor应用程序中如何进行数据输入呢,Blazor也提供了一个类似表单的组件——<EditForm> 组件。此外,Blazor提供了一系列专用输入元素,这些元素可用于格式化和验证用户输入的数据。
我们首先来实现一个功能简单的图书信息添加页面,在已经打开的AddBook.razor文件中的输入如下代码。
@page "/AddBook"
@using BlazorAppDemo.Models
@using Microsoft.EntityFrameworkCore
@inject IDbContextFactory<BookContext> dbFactory <h3>AddBook</h3> <EditForm Model=@addBook OnSubmit="Save">
<div>@Message</div>
<p> 图书名称:
<InputText @bind-Value=addBook.Name></InputText>
</p> <p>作者:
<InputText @bind-value=addBook.Author></InputText>
</p> <p>出版日期:
<InputDate @bind-value=addBook.ReleaseDate></InputDate>
</p>
<p>价格:
<InputNumber @bind-Value=addBook.Price></InputNumber>
</p>
<p>类型:
<InputText @bind-Value=addBook.Type></InputText>
</p>
<p>总页数:
<InputNumber @bind-Value=addBook.TotalPages></InputNumber>
</p>
<p>库存数量:
<InputNumber @bind-Value=addBook.StockQty></InputNumber>
</p>
<p>已租数量:
<InputNumber @bind-Value=addBook.Qty></InputNumber>
</p>
<input type="submit" class="btn btn-primary" value="Save" /> </EditForm> @code { private string Message = string.Empty;
private static BookContext _context;
private Models.Book addBook = new Book();
protected override Task OnInitializedAsync()
{
_context = dbFactory.CreateDbContext();
return base.OnInitializedAsync();
}
private void Save(EditContext editContext)
{
if (editContext.Model is not Book addBook)
{
Message = "你编辑的不是图书信息。";
return;
}
_context.Add(editContext.Model);
int cnt= _context.SaveChanges();
if (cnt>0)
{
Message = "图书信息保存成功!";
}else
{
Message = "图书信息保存失败!";
}
}
}
对于以上代码进行简单的说明一下,<EditForm> 控件支持使用 Model 参数进行数据绑定。 指定一个对象作为此形参的实参。 EditForm 中的输入控件可使用 @bind-Value 参数绑定到由模型公开的属性和字段。使用 [bind-Value] 参数绑定将addBook的特定属性绑定到EditForm中的输入控件中。
Blazor 拥有自己的一组组件,旨在专用于 <EditForm> 元素并支持其他功能中的数据绑定。 下表列出了这些组件。 当 Blazor 呈现包含这些组件的页面时,它们将转换为表中列出的相应 HTML <input> 元素。
|
输入组件 |
呈现为 (HTML) |
|
InputCheckbox |
<input type="checkbox"> |
|
InputDate<TValue> |
<input type="date"> |
|
InputFile |
<input type="file"> |
|
InputNumber<TValue> |
<input type="number"> |
|
InputRadio<TValue> |
<input type="radio"> |
|
InputRadioGroup<TValue> |
一组子单选按钮 |
|
InputSelect<TValue> |
<select> |
|
InputText |
<input> |
|
InputTextArea |
<textarea> |
第四、在Visual Studio 2022的菜单栏上,找到“调试--》开始调试”或是按F5键,Visual Studio 2022会生成BlazorAppDemo应用程序,并在浏览器中打开Home页面,我们使用鼠标点击左边的菜单栏上的“添加图书”菜单项,我们预期页面会进入“AddBook”页面,实际上的结果,应用程序给我们抛出了一个异常,如下图。 
第五,这个异常是由于我们在“bind-value”这绑定代码时,“value”的v写成了小写,如下图。改成大写就可以了。

第六,在Visual Studio 2022的菜单栏上,找到“调试--》开始调试”或是按F5键,Visual Studio 2022会生成BlazorAppDemo应用程序,并在浏览器中打开Home页面,我们使用鼠标点击左边的菜单栏上的“添加图书”菜单项,会进入“AddBook”页面,如下图。 
EditForm 的在进行提交动作时,有三个与提交有关的事件:
- OnValidSubmit. 如果表单上的输入的数据全部通过其对应的验证属性所定义的验证规则,则会触发此事件。
- OnInvalidSubmit. 如果表单上输入的数据中有任何一个数据没有通过其对应的验证属性所定义的验证规则,则会触发此事件。
- OnSubmit. 表单上输入的所有数据是否有效,在提交EditForm时都将会触发生此事件。
对于在单个EditForm中实现输入框的基本验证,最好调用OnValidSubmit 和 OnInvalidSubmit 事件。 如果是很复杂的验证要求,例如将一个输入文本框中的内容与后台数据库中的数据进行交叉检查以确保值的有效,请首先使用 OnSubmit 事件。 EditForm 可以同时处理 OnValidSubmit 和 OnInvalidSubmit 事件,也可以单独处理OnSubmit事件,不能同时处理这两者。 通过向 EditForm 添加一个 Submit 按钮来触发提交。 当用户选择此按钮时,将触发由 EditForm 指定的提交事件。
Visual Studio 2022在生成应用程序时不会检查提交事件组合是否有效或是无效,但是如果事件选择不正确,在运行时将会产生错误。 例如,如果将 OnValidSubmit 与 OnSubmit 结合使用,应用程序将生成以下运行时异常:
Error: System.InvalidOperationException: When supplying an OnSubmit parameter to EditForm, do not also supply OnValidSubmit or OnInvalidSubmit.
EditForm 使用 EditContext 对象跟踪当前对象的状态,包括哪些字段已更改及其当前值。 提交事件将 EditContext 对象做为参数传递。事件处理程序可以使用此对象中的 Model字段来检索用户的输入。
在页面中点击“Save”按钮,将调用EditForm中OnSubmit事件中所指定的 Save方法,将图书信息对象传递给@code代码中的Save方法,保存图书信息到数据库。
如果不存在错误,应用程序将会把我们填写的数据保存到数据库,并且浏览器会重定向到书籍列表页面,在书籍列表页面中的书籍列表中会出现我们刚才保存的数据。如下图。

学习ASP.NET Core Blazor编程系列六——新增图书(上)的更多相关文章
- 学习ASP.NET Core Blazor编程系列十——路由(上)
学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 学习ASP.NET Core Blazor编程系 ...
- 学习ASP.NET Core Blazor编程系列六——初始化数据
学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 学习ASP.NET Core Blazor编程系 ...
- 学习ASP.NET Core Blazor编程系列八——数据校验
学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 学习ASP.NET Core Blazor编程系 ...
- 学习ASP.NET Core Blazor编程系列九——服务器端校验
学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 学习ASP.NET Core Blazor编程系 ...
- 学习ASP.NET Core Blazor编程系列十——路由(中)
学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 学习ASP.NET Core Blazor编程系 ...
- 学习ASP.NET Core Blazor编程系列二——第一个Blazor应用程序(完)
学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 学习ASP.NET Core Blazor编程系 ...
- 学习ASP.NET Core Blazor编程系列二——第一个Blazor应用程序(上)
学习ASP.NET Core Blazor编程系列一--综述 一.概述 Blazor 是一个生成交互式客户端 Web UI 的框架: 使用 C# 代替 JavaScript 来创建信息丰富的交互式 U ...
- 学习ASP.NET Core Blazor编程系列二——第一个Blazor应用程序(中)
学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 四.创建一个Blazor应用程序 1. 第一种创 ...
- 学习ASP.NET Core Blazor编程系列二——第一个Blazor应用程序(下)
学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 学习ASP.NET Core Blazor编程系 ...
随机推荐
- 使用Django2.0.4集成钉钉第三方扫码登录
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_124 钉钉作为阿里旗下的一款免费移动通讯软件,受众群体越来越多,这里我们使用Django来集成一下钉钉的三方账号登录,首先注册钉钉 ...
- 哎,又跟HR在小群吵了一架!
原创不易,求分享.求一键三连 书接上文: 跟HR在大群吵了一架... 难道,降本增效就是裁员吗 前段时间我问了自己一个问题,如果自己真的是公司内部的外包团队,会怎么样?自从思维转变后,很多事情居然得到 ...
- 【Java面试】怎么防止缓存击穿的问题?
"怎么防止缓存击穿?" 这是很多一二线大厂面试的时候考察频率较高的问题. 在并发量较高的系统中,缓存可以提升数据查询的性能,还能缓解后端存储系统的并发压力.可谓是屡试不爽的利器. ...
- .NET 扩展 官方 Logger 实现将日志保存到本地文件
.NET 项目默认情况下 日志是使用的 ILogger 接口,默认提供一下四种日志记录程序: 控制台 调试 EventSource EventLog 这四种记录程序都是默认包含在 .NET 运行时库中 ...
- Node.js + Express + Knex 开发 API 接口
安装依赖包 npm i express knex mysql2 这是 Knex 官方文档地址:Knex.js - SQL query builder. 搭建接口 config.js 新建一个 conf ...
- Web 布局设计(一):固定侧边栏
前言 闲着无事,做一些实战练习,今天实现一个如标题所示的布局设计.通过此次布局设计,我希望掌握position属性值 fixed.absolute.relative.width和height属性值 i ...
- Downie for Mac最强视频下载工具(支持B站优酷土豆腾讯等)
我搜集到的一款简单拖放链接到Downie,它就会下载该网站上的视频.理论可以下载各种视频网站上的视频! 应用介绍 Downie 是一款Mac平台上的优秀视频下载软件,使用非常简单,只需将下载链接放置D ...
- 二叉搜索树TREE(线段树,区间DP)
前言 线段树+区间DP题,线段树却不是优化DP的,是不是很意外? 题面 二叉搜索树是一种二叉树,每个节点都有一个权值,并且一个点的权值比其左子树里的点权值都大,比起右子树里的点权值都小. 一种朴素的向 ...
- HTML初学者小知识
引用js <script src="链接/js代码位置" type="text/javascript"></script> 引用css ...
- RabbitMQ 入门系列:10、扩展内容:延时队列:延时队列插件及其有限的适用场景(系列大结局)。
系列目录 RabbitMQ 入门系列:1.MQ的应用场景的选择与RabbitMQ安装. RabbitMQ 入门系列:2.基础含义:链接.通道.队列.交换机. RabbitMQ 入门系列:3.基础含义: ...