ASP.NET CORE 学习 NOTE

What is ASP.NET Core MVC

M:Model 模型对象,在数据库中存取数据
C:Controller 控制器,系统中处理用户交互,控制和读取用户输入,向模型发送数据等
V:View 处理数据显示,可视为UI部分

Request Pipeline

检查和处理http请求 => 交给中间件(Middleware)处理

中间件接收上一个中间件的输出并传输给下一个中间件,有序排列产生Pipeline.

例如: request => logging => static files => MVC

Segments

自定义路由,与路径,文件类型等无关

{域名}/{Controller}/{Action}/{Parameter}

Attribute Routing

例如可以这样使用:

[Route("[Controller]/[Action]")]
public class HomeController : Controller
{
    public IActionResult Index()
    {
        return View();
    }
}

其中的[Route("[Controller]/[Action]")]可以写作[Route("admin/[Controller]/[Action]")]等进而控制路由.

Action:POST

  • Need “HttpPost” Attribute on Action function

Model

映射数据库;对象化数据;获取,更新,传递,保存数据;

Repository 仓库模式

对象化保存数据,可忽略如何保存保存形式等.

注册如系统依赖注入容器

AddTransient 每次发起请求则创建全新仓库请求结束则注销,每次数据相互独立
AddSingleton 只创建一个仓库,便于管理,可能造成数据污染

ASP.NET MVC ViewModel

View Model

View Model 中的数据会与UI界面双向绑定.

特点:

  • 依然是模型
  • 用视图模型代替数据上下文
  • POCO(plain old class object),不包含方法的简单类

What is ASP.NET MVC ViewModel

将Model1,Model2中的数据部分映射组合为View Model

使用View Model的原因:

  • 减少页面逻辑复杂度
  • 处理页面的数据逻辑,管理页面状态
  • 有利于团队协作和日后维护

Entity Framework Core

  • 跨平台
  • 可以建模
  • 使用LINQ查询,更改,保存数据
  • 可以通过异步进行数据提交与保存
  • 提供一级缓存,便于提高重复查询的效率
  • 提供数据迁移工具

组件

EDM实体数据模型 -> [ LINQ , Entity SQL ] -> Object Service -> Data Provider -> ADO.Net -> Database

常用验证特性

RequiredAttribute:用于验证必需数据字段。
RangeAttribute:用于验证数值字段的值是否在指定的范围之内
StringLengthAttribute:用于验证目标字段的字符串长度是否在指定的范围之内。
MaxLengthAttribute/MinLengthAttribute:用于验证字符/数组字典的长度是否小于/大于指定的上/下限。
CreditCardAttribute:用于验证数据字段值是信用卡号。
EmailAddressAttribute:用于验证电子邮件
PhoneAttribute:用于验证是否为电话格式
UrlAttribute:用于验证是否为Url
KeyAttribute:验证是否唯一
DisplayAttribute:指定显示的字符串
CompareAttribute:提供用于比较两个属性的特性。

ASP.Net Core Identity

  • Password Hashing 密码哈希
  • Tokenization 邮箱验证,账户锁定
  • Two Facts Authentication 双因素账户验证
  • Authentication 身份认证
  • Authorization 授权
  • External Login 第三方登录

细节和学习

请求参数

public IActionResult GetInfo([FormQuery]string mode)
{
    switch(mode){
        case "normal":
            return View("Normal");
        case "preview":
            return View("Preview");
        default:
            return View("~/Views/Home/Index.cshtml");
    }
}

阻止控制器中的方法公开为Action

为方法添加[NonAction]属性.

重命名Action方法

为方法添加[ActionName("newName")]属性.

目录浏览与文件服务

文件目录浏览与访问静态文件

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        //上文省略
        services.AddDirectoryBrowser();
    }
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        app.UseStaticFiles(new StaticFileOptions
        {
            FileProvider = new PhysicalFileProvider(Path.Combine(env.WebRootPath,"image")),
            RequestPath = "/gifts"
        });
        app.UseDirectoryBrowser(new DirectoryBrowserOptions
        {
            FileProvider = new PhysicalFileProvider(Path.Combine(env.WebRootPath,"image")),
            RequestPath = "/gifts"
        });
        //访问 https://localhost:xxx/gifts以访问image文件夹
    }
}

二者均需要时可选用FileServer

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        //上文省略
        services.AddDirectoryBrowser();
    }
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        app.UseFileServer(new FileServerOptions
        {
            FileProvider = new PhysicalFileProvider(Path.Combine(env.WebRootPath)),
            RequestPath = "/files",
            EnableDirectoryBrowsing = true,
        });
        //访问 https://localhost:xxx/gifts以访问image文件夹
    }
}