深入浅出ASP .NET Core学习记录

《深入浅出》第二部分总结

第二章的学习代码:代码

概括

主要是实操,下面是实操完的项目结构图
请添加图片描述

几个文件夹,代表什么意思

  1. Controllers(重点):控制器,控制输入输出
  2. Models(重点):一些实体类,该项目中使用学生类
  3. Views(重点):视图层,最后如何展示在此写
  4. DataRepositories(重点)):数据操作层,主要就是对数据的定义与操作(增删改查),此项目使用一个Interface定义数据操作,使用两个实现类,一个是内存中实现增删改查,另一个是数据库中实现增删改查
  5. ViewModels:View的一个派生类,有时一个实体类展示在视图层中并不完善,该项目中添加一个视图标题,该标题与学生实体类无关,然而在视图层需要展示,因此定义一个ViewModel的类
  6. Infrastructure(重点):基础设施层,存放一些上下文类,该项目定义一个AppDbContext的数据库上下文,与数据库相关联
  7. Extensions:定义一些拓展,该项目定义了中英文转换的拓展
  8. Migrations:该文件是数据库迁移生成的文件

Controller难点细节

  1. 视图返回使用IActionResult返回
  2. 使用[HttpXXX]定义不同返回
  3. 使用ModelState.IsValid定义模型是否有效

Models难点细节

相对简单,没太多难点细节

Views难点细节

  1. 控制器对应的视图,要放对位置,比如ControllerCreate方法,就应该创建Create.cshtml视图到Views/Home的文件夹中
  2. _ViewImports.cshtml的作用,全局导入
  3. _ViewStart.cshtml开始视图,所有视图加载都必须先加载这里面的东西,算是一个通用项,比如头部,尾部的公用部分
  4. @model的使用,如@model XXXX 注入, asp-for=属性名字直接用,其余使用@属性使用
  5. TagHelper的使用,asp-controller,asp-action,asp-route-id在a标签,form标签中使用
  6. select标签的使用,asp-items="Html.GetEnumSelectList<MajorEnum>()

DataRepositories难点细节

相对简单,没太多难点细节

ViewModels难点细节

  1. 几个注解
    • [Display(Name = “名字”)]
    • [Required(ErrorMessage = “请输入姓名,他不能为空”), MaxLength(50, ErrorMessage = “名字的长度不能超过50个字符”)]
    • [RegularExpression]

Infrastructure难点细节

主要是将DbContext,由于sqlServer要钱,因此我使用Mysql

  1. 继承DbContext,重写构造器public AppDbContext(DbContextOptions<AppDbContext> options) : base(options)
  2. DbSet 代表一个表
  3. OnModelCreating重写,该方法是运行前执行的东西,比如初始化数据库等操作

Migrations难点细节

  1. 记住两个命令
    • Add-Migration XXX
    • Update-database XXX

其他细节

文件处理

  1. 使用IForm对象
  2. 复制对象:IForm对象.CopyTo(new FileStream(filePath,FileMode.Create))

Guid

  1. 使用:Guid.NewGuid()

根目录使用

  1. 注入IWebHostEnvironment对象
  2. _webHostEnvironment.WebRootPath

startup.cs

// 数据库连接
services.AddDbContextPool<AppDbContext>(options =>
    options.UseMySql(_configuration.GetConnectionString("MockStudentDBConnection")));

其他内容

一. 404错误与异常拦截

404主要代码

  1. 使用UseStatusCodePagesWithReExecute()
    或者UseStatusCodePagesWithRedirects中间件

startup.csConfigure添加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. 添加NotFound视图
@{
    ViewBag.Title = "页面不存在";
}
<h1>@ViewBag.ErrorMessage</h1>

<a asp-action="Index" asp-controller="Home">单击此处返回首页</a>

异常主要代码

  1. 开发环境使用UseDeveloperExceptionPage()中间件;对于非开发环境,使用UseExceptionHandler()方法
  2. controller
[Route("Error")]
public IActionResult Error()
{
    var exceptionHandlerPathFeature = HttpContext.Features.Get<IExceptionHandlerPathFeature>();

    logger.LogError($"路径{exceptionHandlerPathFeature.Path}" +
                    $"产生了一个错误{exceptionHandlerPathFeature.Error}");

    return View("Error");
}
  1. 视图
<h3>
    程序请求时发生了一个内部错误,我们会反馈给团队,我们正在努力解决这个问题。
</h3>
<h5>请通过1625296952@qq.com与我们取得联系</h5>

2. 日志

  1. appsetting,json设置LogLevel
  2. 通过统一的自定义错误视图来记录日志信息
private readonly ILogger logger;
  1. 使用NLog
    • 安装NLog.Web.AspNetCore NuGet
    • 创建nlog.config文件
  2. 日志级别
    • Trace= 0
    • Debug= 1
    • Information= 2
    • Warning= 3
    • Error= 4
    • Critical= 5
    • None= 6
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值