深入浅出ASP .NET Core学习记录
《深入浅出》第二部分总结
第二章的学习代码:代码
概括
主要是实操,下面是实操完的项目结构图
几个文件夹,代表什么意思
- Controllers(重点):控制器,控制输入输出
- Models(重点):一些实体类,该项目中使用学生类
- Views(重点):视图层,最后如何展示在此写
- DataRepositories(重点)):数据操作层,主要就是对数据的定义与操作(增删改查),此项目使用一个Interface定义数据操作,使用两个实现类,一个是内存中实现增删改查,另一个是数据库中实现增删改查
- ViewModels:View的一个派生类,有时一个实体类展示在视图层中并不完善,该项目中添加一个视图标题,该标题与学生实体类无关,然而在视图层需要展示,因此定义一个ViewModel的类
- Infrastructure(重点):基础设施层,存放一些上下文类,该项目定义一个AppDbContext的数据库上下文,与数据库相关联
- Extensions:定义一些拓展,该项目定义了中英文转换的拓展
- Migrations:该文件是数据库迁移生成的文件
Controller难点细节
- 视图返回使用
IActionResult
返回 - 使用[HttpXXX]定义不同返回
- 使用
ModelState.IsValid
定义模型是否有效
Models难点细节
相对简单,没太多难点细节
Views难点细节
- 控制器对应的视图,要放对位置,比如
Controller
的Create
方法,就应该创建Create.cshtml
视图到Views/Home
的文件夹中 - _ViewImports.cshtml的作用,全局导入
- _ViewStart.cshtml开始视图,所有视图加载都必须先加载这里面的东西,算是一个通用项,比如头部,尾部的公用部分
- @model的使用,如
@model XXXX
注入,asp-for=属性名字
直接用,其余使用@属性使用 - TagHelper的使用,
asp-controller
,asp-action
,asp-route-id
在a标签,form标签中使用 - select标签的使用,
asp-items="Html.GetEnumSelectList<MajorEnum>()
DataRepositories难点细节
相对简单,没太多难点细节
ViewModels难点细节
- 几个注解
- [Display(Name = “名字”)]
- [Required(ErrorMessage = “请输入姓名,他不能为空”), MaxLength(50, ErrorMessage = “名字的长度不能超过50个字符”)]
- [RegularExpression]
Infrastructure难点细节
主要是将DbContext,由于sqlServer要钱,因此我使用Mysql
- 继承DbContext,重写构造器
public AppDbContext(DbContextOptions<AppDbContext> options) : base(options)
- DbSet 代表一个表
- OnModelCreating重写,该方法是运行前执行的东西,比如初始化数据库等操作
Migrations难点细节
- 记住两个命令
- Add-Migration XXX
- Update-database XXX
其他细节
文件处理
- 使用IForm对象
- 复制对象:IForm对象.CopyTo(new FileStream(filePath,FileMode.Create))
Guid
- 使用:Guid.NewGuid()
根目录使用
- 注入IWebHostEnvironment对象
- _webHostEnvironment.WebRootPath
startup.cs
// 数据库连接
services.AddDbContextPool<AppDbContext>(options =>
options.UseMySql(_configuration.GetConnectionString("MockStudentDBConnection")));
- 1
- 2
- 3
其他内容
一. 404错误与异常拦截
404主要代码
- 使用
UseStatusCodePagesWithReExecute()
或者UseStatusCodePagesWithRedirects
中间件
startup.cs
的Configure
添加app.UseStatusCodePagesWithReExecute("/Error/{0}");
2. 添加ErrorController
[Route("Error/{statusCode}")]
public IActionResult HttpStatusCodeHandler(int statusCode)
{
var statusCodeResult = HttpContext.Features.Get<IStatusCodeReExecuteFeature>();
switch (statusCode)
{
case 404:
ViewBag.ErrorMessage = "抱歉,读者访问的页面不存在";
logger.LogWarning($"发生一个404错误,路径=" +
$"{statusCodeResult.OriginalPath}以及查询字符串=" +
$"{statusCodeResult.OriginalQueryString}");
break;
}
return View("NotFound");
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 添加NotFound视图
@{
ViewBag.Title = "页面不存在";
}
<h1>@ViewBag.ErrorMessage</h1>
<a asp-action="Index" asp-controller="Home">单击此处返回首页</a>
- 1
- 2
- 3
- 4
- 5
- 6
异常主要代码
- 开发环境使用
UseDeveloperExceptionPage()
中间件;对于非开发环境,使用UseExceptionHandler()
方法 - controller
[Route("Error")]
public IActionResult Error()
{
var exceptionHandlerPathFeature = HttpContext.Features.Get<IExceptionHandlerPathFeature>();
logger.LogError($"路径{exceptionHandlerPathFeature.Path}" +
$"产生了一个错误{exceptionHandlerPathFeature.Error}");
return View("Error");
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 视图
<h3>
程序请求时发生了一个内部错误,我们会反馈给团队,我们正在努力解决这个问题。
</h3>
<h5>请通过[email protected]与我们取得联系</h5>
- 1
- 2
- 3
- 4
2. 日志
appsetting,json
设置LogLevel- 通过统一的自定义错误视图来记录日志信息
private readonly ILogger logger;
- 1
- 使用NLog
- 安装NLog.Web.AspNetCore NuGet
- 创建nlog.config文件
- 日志级别
- Trace= 0
- Debug= 1
- Information= 2
- Warning= 3
- Error= 4
- Critical= 5
- None= 6