简介
包含 01 到 03 章的笔记
ASP.NET Core 的结构:
1. 理解框架
- 应用程序框架
MVC
框架. 经典的框架, 受到SPA
的影响较大. 一般在处理复杂应用时还是会用到.Razor Pages
. 页面模型, 开发成本比起MVC
更小, 一般作为小规模应用开发. 可以与MVC
合用.Blazor
. 包含Blazor Server
和Blazor WebAssembly
, 让C#
可以在浏览器中运行.
- 实用程序框架
Identity
. 实用微软的认证授权框架.EntityFramework
- 平台. 本书没有引入的是
SignalR
和gRPC
.
2. 其他
然后介绍了本书的结构与各个部分的内容. 并介绍了与作者联系的方式, 代码, 勘误等内容.
3. 入门
选择代码编辑器. 然后是安装步骤解释与截图.
安装 SDK. 查看 SDK
dotnet --list-sdks
安装 VSCode
, 注意添加到环境变量, 以及右键菜单中.
安装数据库 SQLServer LocalDB
.
个人还是比较喜欢使用
Express
版本, 或者Developer
版本. 在Docker
上运行, 让在 Mac 上开发很方便.
4. 创建 ASP.NET Core 项目
这个基本操作复核作者的开发模式. 基本上可以理解为在 VSCode
+ 命令行的开发模式下, 尽可能完成 VS
的功能
创建项目:
dotnet new globaljson --sdk-version <version> --output <proj_dir>
dotnet new mvc --no-https --output <proj_dir> --framework <netversion>
作者不喜欢使用模板, 会从最小模板开始写代码. 这点大赞.
关于
sdk
的版本, 可以使用dotnet --list-sdks
来查看.
framework
的版本可以是:netcoreapp3.1
,net5.0
,net6.0
,net7.0
,net8.0
等.
然后分别演示了在 VS
和 VSCode
中打开项目, 并运行项目 (VSCode
会安装插件, 并生成调试用文件).
运行使用命令
dotnet run
补充说明
# 监视运行 (可以省略 run 命令, 但是如果需要其他参数, 或环境变量, 则需要添加 run 命令) dotnet watch run
例如使用指定环境变量, 运行监视命令
dotnet watch run -- --environment sit
环境的值, 在运行时直接决定 加载
appsettings.环境.json
的文件. 可以利用该功能加载不同环境.
4.1 理解端点 Endpoint
传入的请求由端点来处理. MVC
模式下, 请求进入后, 由控制器下的某个动作方法来处理.
约定:
- 控制器放在
Controllers
文件夹下. - 控制器是一个类,
MVC
的控制器继承自Controller
(Microsoft.AspNetCore.Mvc.Controller
). - 动作方法是控制器中的方法. 动作方法返回
IActionResult
, 具体返回一个View
调用. 这里作者修改返回一个字符串.
运行后访问即可看到对应字符串.
补充, 作者使用运行但不调试 (
Ctrl + F5
)
4.2 理解路由
由于路由定义中将 Home
控制器, 和 Index
动作方法配置为默认, 因此下面的路由均表示 HomeController
下的 Index
方法:
/
/Home
/Home/Index
4.3 理解 HTML 渲染
原则上, 路由将请求重定向到 动作方法后, 如果动作方法要返回页面, 直接返回页面的 HTML
, 然后配合 Content-Type
, 浏览器就会进行渲染显示.
因此在 MVC
中使用了视图引擎. 视图引擎是一个执行模型, 将视图和数据合并后转换为 HTML
来返回.
约定:
- 动作方法调用
View()
方法, 并将其作为IActionResult
来返回, 该方法就是在生成HTML
+ 对应的响应头. - 默认约定
View()
会去寻找与控制器/动作方法
同名的视图文件. 约定视图文件放在Views
目录下. 并且目录结构与控制器, 和动作方法一一对应. 即Home
控制器下的Index
动作方法, 对应Views
目录下的Home
文件夹下的Index.cshtml
视图文件. View()
常用重载有几个View()
使用默认视图, 没有为视图传入模型参数.View("视图名")
指定视图, 没有传入模型参数.View(模型对象)
使用默认视图, 传入模型参数.View("视图名", 模型对象)
指定视图, 并传入模型参数.
- 一个视图文件背后对应一个视图模型. 这决定了视图文件的结构.
@model
视图模型的类型@ {}
代码块, 用来配置布局- 正常的 HTML 片段
- 使用
@Model
引用视图模型对象
5. 第一个 ASP.NET Core 应用
通过一个 DEMO
来介绍 MVC
的基本结构与用法. 这里不解释原理, 仅仅是操作步骤.
5.1 场景设置
创建一个约定参会的邀请应用:
- 需要显示聚会信息页面
- 可用于 RSVP 的表单
- 确认 RSVP 表单, 返回一个感谢页面
- 显示聚会数据汇总页面
5.2 创建项目
命令行创建项目
dotnet new globaljson --sdk-version 3.1.101 --output PartyInvites
dotnet new mvc --no-https --output PartyInvites --framework netcoreapp3.1
打开代码, 编辑 HomeController
, 移除所有控制器类中的内容, 仅保留一个 Index
动作方法, 并调用 View()
返回.
namespace PartyInvites.Controllers {
public class HomeController: Controller {
public IActionResult Index() {
return View();
}
}
}
修改 Views/Home/Index.cshtml
文件
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width"/>
<title>Party!</title>
</head>
<body>
<div>
<div>
We're going to have an exciting party.<br />
(To do: sell it better. Add picture or something.)
</div>
</div>
</body>
</html>
运行后即可单开展示上述 HTML
的页面.
补充
在 Pro ASP.NET Core 6/7
中创建项目多出了两个步骤, 同时添加了修改 Properities/launchSettings.json
的部分.
- 创建项目的时候
- 创建
sln
解决方案配置文件 - 将项目添加到解决方案中 (这样使用
VS
也可以打开项目)
- 创建
- 修改配置项目的 端口为
5000
, 直接编辑Properties/launchSettings.json
使用 Pro ASP.NET Core 7
中的代码演示:
dotnet new globaljson --sdk-version 7.0.100 --output PartyInvites
dotnet new mvc --no-https --output PartyInvites --framework net7.0
dotnet new sln -o PartyInvites
dotnet sln PartyInvites add PartyInvites
dotnet sln 解决方案文件 add 需要添加的项目文件夹
将后面的添加到前面.
5.3 添加数据模型
引入了一些概念, 模型, 模型域, 域对象.
本质是一个东西.
约定模型放在 Models
目录中.
- 创建
GuestResponse.cs
文件. - 创建
GustResponse
类, 包含属性:Name
,Email
,Phone
,WillAttend
namespace PartyInvites.Models {
public class GustResponse {
public string Name { get; set; }
public string Email { get; set; }
public string Phone { get; set; }
public bool? WillAttend { get; set; }
}
}
注意这里的
WillAttend
是可空类型, 有助于后期做数据绑定.
5.4 创建第二个操作与视图
这次创建表单, 用来录入用户的信息.
- 添加动作方法
RevpForm
, 因为返回视图, 直接返回ViewResult
类型. - 调用
View()
并返回. - 添加
RsvpForm.cshtml
视图文件.
public ViewResult RsvpForm() {
return View();
}
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>RsvpForm</title>
</head>
<body>
<div>
This is the RsvpForm.cshtml View
</div>
</body>
</html>
运行后得到:
5.5 连接操作方法
使用内置的 tag-helper
, 在 Index
上添加跳转到 RsvpForm
的连接
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width"/>
<title>Party!</title>
</head>
<body>
<div>
<div>
We're going to have an exciting party.<br />
(To do: sell it better. Add picture or something.)
</div>
<a asp-action="RsvpForm">RSVP Now</a>
</div>
</body>
</html>
5.6 构建表单
主要是修改视图文件. 关键点:
- 视图模型使用
GuestResponse
- 表单中使用
tag helper