1、创建项目
.NET Core——ASP.NET Core Web 应用——web application
2、主项目文件夹和文件的概述
Pages 文件夹:包含 Razor 页面和支持文件。 每个 Razor 页面都是一对文件:
一个 .cshtml 文件,其中包含使用 Razor 语法的 C# 代码的 HTML 标记。
一个 .cshtml.cs 文件,其中包含处理页面事件的 C# 代码。
wwwroot 文件夹:包含静态文件,如 HTML 文件、JavaScript 文件和 CSS 文件。
appSettings.json:包含配置数据,如连接字符串。
Program.cs:包含程序的入口点。
Startup.cs:包含配置应用行为的代码,例如,是否需要同意 cookie。
3、添加模型
模型类称为 POCO 类,因为它们与 EF Core 没有任何依赖关系。
它们定义数据库中存储的数据属性。
(1)、右键单击项目 >“添加” > “新建文件夹”。 将文件夹命名为“Models”。
(2)、右键单击“Models”文件夹。 选择“添加” > “类”。 (例:Movie)
(3)、向类添加属性。
4.搭建模型的基架
基架工具将生成页面,用于对模型执行创建、读取、更新和删除 (CRUD) 操作。
(1)、创建“Pages/Movies”文件夹:
(2)、右键单击 Pages/Movies 文件夹 >“添加” > “新搭建基架的项目”。
(3)、在“添加基架”对话框中,选择“使用实体框架生成 Razor Pages (CRUD)” > “添加”。
(4)、完成“使用实体框架(CRUD)添加 Razor Pages”对话框:
A.在“模型类”下拉列表中,选择“Movie (RazorPagesMovie.Models)。
B.在“数据上下文类”行中,选择 +(加号)并接受生成的名称“RazorPagesMovie.Models.RazorPagesMovieContext”。
C.选择“添加”。
(5)、初始迁移
程序包管理器控制台 (PMC) 用于:
添加初始迁移。
使用初始迁移来更新数据库。
从“工具”菜单中,选择“NuGet 包管理器” > “包管理器控制台”。
命令:
PM>Add-Migration Initial
PM>Update-Database
(6)、
Razor 页面派生自 PageModel。
按照约定,PageModel 派生的类称为
Razor 可以从 HTML 转换为 C# 或 Razor 特定标记。
当 @ 符号后跟 Razor 保留关键字时,它会转换为 Razor 特定标记,
否则会转换为 C#。
@page Razor 指令将文件转换为一个 MVC 操作,这意味着它可以处理请求。
@page 必须是页面上的第一个 Razor 指令。
@page 是转换到 Razor 特定标记的一个示例
@model 指令指定传递给 Razor 页面的模型类型。
PageModel 基类具有 ViewData 字典属性,可用于添加要传递到某个视图的数据。
可以使用键/值模式将对象添加到 ViewData 字典。
5.使用数据库和 ASP.NET Core
(1)、RazorPagesMovieContext 对象处理连接到数据库并将 Movie 对象映射到数据库记录的任务。 在 Startup.cs 的 ConfigureServices 方法中向依赖关系注入容器注册数据库上下文(已经自动生成):
services.AddDbContext
(
options =>
options.UseSqlServer
(
Configuration.GetConnectionString("RazorPagesMovieContext")
)
);
(2)、ASP.NET Core 配置系统会读取 ConnectionString。 为了进行本地开发,它会从 appsettings.json 文件获取连接字符串(已经自动生成):
"ConnectionStrings": {
"RazorPagesMovieContext": "Server=(localdb)\\mssqllocaldb;Database=RazorPagesMovieContext-1234;Trusted_Connection=True;MultipleActiveResultSets=true"
}
(3)、SQL Server Express LocalDB
LocalDB 是轻型版的 SQL Server Express 数据库引擎,以程序开发为目标。 LocalDB 作为按需启动并在用户模式下运行的轻量级数据库没有复杂的配置。 默认情况下,LocalDB 数据库在 C:/Users/
A.从“视图”菜单中,打开“SQL Server 对象资源管理器”(SSOX)。
B.右键单击 Movie 表,然后选择“视图设计器”
C.右键单击 Movie 表,然后选择“查看数据”
(4)、设定数据库种子
在 Models 文件夹中创建一个名为 SeedData 的新类
(5)、添加种子初始值设定项
在 Program.cs 中,修改 Main 方法以执行以下操作:
A.从依赖关系注入容器获取数据库上下文实例。
B.调用 seed 方法,并将上下文传递给它。
C.Seed 方法完成时释放上下文。
(6)、测试应用
删除 DB 中的所有记录。 可以使用浏览器中的删除链接,也可以从 SSOX 执行此操作
强制应用初始化(调用 Startup 类中的方法),使种子方法能够正常运行。 若要强制进行初始化,必须先停止 IIS Express,然后再重新启动它。 可以使用以下任一方法来执行此操作:
A.右键单击通知区域中的 IIS Express 系统任务栏图标,然后点击“退出”或“停止站点”:
B.右键单击通知区域中的 IIS Express 系统任务栏图标,然后点击“退出”或“停止站点”
C.如果是在非调试模式下运行 VS 的,请按 F5 以在调试模式下运行。
如果是在调试模式下运行 VS 的,请停止调试程序并按 F5。
6.数据注释
(1)、[Column(TypeName = "decimal(18, 2)")] 数据注释使 Entity Framework Core 可以将 Price 正确映射到数据库中的货币。
(2)、Display 特性指定要显示的字段名称的内容
(3)、 DataType 属性指定数据的类型(日期),使字段中存储的时间信息不会显示。
7.标记帮助程序
标记帮助程序使服务器端代码可以在 Razor 文件中参与创建和呈现 HTML 元素。
表单标记帮助程序。 提交表单时,筛选器字符串将通过查询字符串发送到 Pages/Movies/Index 页面。
输入标记帮助程序。
8.“{id:int?}”路由模板——@page "{id:int}"指令——@page "{id:int?}"
9.将搜索添加到 ASP.NET Core Razor 页面
(1)、index.cshtml.cs新增属性:
[BindProperty(SupportsGet = true)]
public string SearchString { get; set; }
// Requires using Microsoft.AspNetCore.Mvc.Rendering;
public SelectList Genres { get; set; }
[BindProperty(SupportsGet = true)]
public string MovieGenre { get; set; }
解释:
SearchString:包含用户在搜索文本框中输入的文本。 SearchString 使用 [BindProperty] 特性进行修饰。 [BindProperty] 会绑定名称与属性相同的表单值和查询字符串。 在 GET 请求中进行绑定需要 (SupportsGet = true)。
Genres:包含流派列表。 Genres 使用户能够从列表中选择一种流派。
SelectList 需要 using Microsoft.AspNetCore.Mvc.Rendering;
MovieGenre:包含用户选择的特定流派(例如“西部”)。
(2)、 OnGetAsync方法更改如下:
{
var movies = from m in _context.Movie
select m;
if (!string.IsNullOrEmpty(SearchString))
{
movies = movies.Where(s => s.Title.Contains(SearchString));
}
Movie = await movies.ToListAsync();
}
(3)、LINQ查询
Lambda 在基于方法的 LINQ 查询中用作标准查询运算符方法的参数,如 Where 方法或 Contains(前面的代码中所使用的)。
在对 LINQ 查询进行定义或通过调用方法(如 Where、Contains 或 OrderBy)进行修改后,此查询不会被执行。
相反,会延迟执行查询。
这意味着表达式的计算会延迟,直到循环访问其实现的值或者调用 ToListAsync 方法为止。
(页面上没添加搜索框等)
(4)路由模板@page "{searchString?}"
如果向索引页面添加了以上路由模板,搜索字符串则可作为 URL 段传递(例如https://localhost:5001/Movies/Ghost)。
10.将新字段添加到 ASP.NET Core 中的 Razor 页面
(1)、Entity Framework Code First
在此部分中,Entity Framework Code First 迁移用于:
将新字段添加到模型。
将新字段架构更改迁移到数据库。
使用 EF Code First 自动创建数据库时,Code First 将:
向数据库添加表格,以跟踪数据库的架构是否与从生成它的模型类同步。
如果该模型类未与数据库同步,EF 将引发异常。
通过自动验证同步的架构/模型可以更容易地发现不一致的数据库/代码问题。
(2)、在 DB 更新为包括新字段之前,应用将不会正常工作。 如果立即运行,应用会引发 SqlException:
SqlException: Invalid column name 'Rating'.
此错误是由于更新的 Movie 模型类与数据库的 Movie 表架构不同导致的。 (数据库表中没有 Rating 列。)
可通过几种方法解决此错误:
A.让 Entity Framework 自动丢弃并使用新的模型类架构重新创建数据库。 此方法在开发周期早期很方便;通过它可以一起快速改进模型和数据库架构。 此方法的缺点是会导致数据库中的现有数据丢失。 请勿对生产数据库使用此方法! 当架构更改时丢弃数据库并使用初始值设定项以使用测试数据自动设定数据库种子,这通常是开发应用的有效方式。
B.对现有数据库架构进行显式修改,使它与模型类相匹配。 此方法的优点是可以保留数据。 可以手动或通过创建数据库更改脚本进行此更改。
C.使用 Code First 迁移更新数据库架构。
(3)、数据库迁移
从“工具”菜单中,选择“NuGet 包管理器”>“包管理器控制台”。
在 PMC 中,输入以下命令:
PM>Add-Migration Rating
PM>Update-Database
Add-Migration 命令:
会通知框架执行以下操作:
将 Movie 模型与 Movie DB 架构进行比较。
创建代码以将 DB 架构迁移到新模型。
名称“Rating”是任意的,用于对迁移文件进行命名。 为迁移文件使用有意义的名称是有帮助的。
Update-Database 命令:
指示框架将架构更改应用到数据库。
如果删除 DB 中的所有记录,种子初始值设定项会设定 DB 种子,并将包括 Rating 字段。
如果不删除所有记录,包括Rating字段,但是没有数据。
可以使用浏览器中的删除链接,也可以从 Sql Server 对象资源管理器 (SSOX) 执行此操作。
另一个方案是删除数据库,并使用迁移来重新创建该数据库。 删除 SSOX 中的数据库:
A.在 SSOX 中选择数据库。
B.右键单击数据库,并选择“删除”。
C.检查“关闭现有连接”。
D.选择“确定”。
11.将验证添加到 ASP.NET Core Razor 页面
(1)、不要重复自己
软件开发的一个关键原则被称为 DRY(即“不要自我重复”)。 Razor 页面鼓励进行仅指定一次功能的开发,且功能在整个应用中反映。 DRY 可以帮助:
A.减少应用中的代码量。
B.使代码更加不易出错,且更易于测试和维护。
Razor 页面和 Entity Framework 提供的验证支持是 DRY 原则的极佳示例。 验证规则在模型类中的某处以声明方式指定,且在应用的所有位置强制执行。
在模型应用 DataAnnotations 后,即已启用验证 UI。 自动创建的 Razor 页面自动选取了验证规则(使用 Movie 模型类的属性上的验证特性)。
“创建”和“编辑”页面中没有验证规则。 仅可在 Movie 类中指定验证规则和错误字符串。 这些验证规则将自动应用于编辑 Movie 模型的 Razor 页面。
需要更改验证逻辑时,也只能在该模型中更改。 将始终在整个应用程序中应用验证(在一处定义验证逻辑)。 单处验证有助于保持代码干净,且更易于维护和更新。
(2)、DataAnnotations命名空间,在模型的属性上添加注释。
[StringLength(60, MinimumLength = 3)]
[Required]
[Range(1, 100)]
[DataType(DataType.Currency)]
[RegularExpression(@"^[A-Z]+[a-zA-Z""'\s-]*$")]