学习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编程系 ...
随机推荐
- Docker容器保姆:在centos7.6上利用docker-compose统一管理容器和服务
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_108 众所周知,一个大型的Docker容器组成的微服务应用中,容器的数量是非常巨大的,如果依赖传统的人工配置方式进行维护,对于开发 ...
- HCIA-Datacom 3.1 实验一:以太网基础与VLAN配置实验
实验介绍: 以太网是一种基于CSMA/CD(Carrier Sense Multiple Access/Collision Detection)的共享通讯介质的数据网络通讯技术.当主机数目较多时会导致 ...
- 推荐软件(一):Motrix——磁力下载器
个人觉得迅雷这样的下载器广告又多,启动速度又慢,又占用内存和存储,非常地不好用.有时候下载速度也不是你自己网速的最大值,而且有一些资源也会因为版权问题阻止你下载. Motrix 界面非常简洁:下载速度 ...
- SpringMVC完整版详解
1.回顾MVC 1.1什么是MVC MVC是模型(Model).视图(View).控制器(Controller)的简写,是一种软件设计规范. 是将业务逻辑.数据.显示分离的方法来组织代码. MVC主要 ...
- 必应每日壁纸API
必应官网每天会更新不同的高质量背景图 我们可以通过 F12 开发者工具手动下载当天的壁纸,网上也有很多网站提供必应壁纸下载.如果我们想每天应用最新的壁纸到我们的网站上就需要手动下载再设置壁纸,比较麻烦 ...
- 全链路追踪体验—最简陋TraceId的生成
对于后端开发来说,排查问题是常有的事情.而排查问题时最常用的就是看日志,看一次调用中经过了哪些系统,是那个系统出问题了.这就需要业务日志中关联调用链的TraceId信息,从而在应用出现问题时,能够通过 ...
- Python入门系列(二)语法风格
python缩进 Python使用缩进来表示代码块,例如 if 5 > 2: print("Five is greater than two!") 如果跳过缩进,Python ...
- EPIC限免提示
通过云函数每周定时推送限免内容到手机 import datetime import requests requests.packages.urllib3.disable_warnings() # da ...
- JAVA中自定义扩展Swagger的能力,自动生成参数取值含义说明,提升开发效率
大家好,又见面了. 在JAVA做前后端分离的项目开发的时候,服务端需要提供接口文档供周边人员做接口的对接指导.越来越多的项目都在尝试使用一些基于代码自动生成接口文档的工具来替代由开发人员手动编写接口文 ...
- 餐饮行业SRM案例:方正璞华"采云链"携手和府捞面
方正璞华在与和府捞面的项目中,帮助整合采购系统,系统化管理供应商,优化采购流程和数据分析,建立储备知识库. 项目背景 企业介绍 ◇ 和府捞面成立于2012年,是国内中式面食头部品牌.自2013年首 ...