【从实作学习ASP.NET Core】Day06 | 看懂 CRUD 的 Actions

今天我们要来搞懂昨天用 Scaffold 建立出来的 CRUD 到底在做些什麽事
但在看程序码前我们需要先搞懂两个观念

  • Model 与资料库的沟通管道: Entity Framework Core
  • View 和 Controller 表单传值: HttpGet 和 HttpPost

Entity Framework Core

Entity Framework Core 是微软新一代的物件关联对应 (ORM) 框架,以 .NET Core 实作,不过它是归属於 ASP.NET Core 专案的一部份,在 ASP.NET Core 开始开发时就被列入标准功能,与现行的 Entity Framework 一样,是微软官方建议使用的资料存取功能。

EF Core 主要用於在资料库与物件对应处理,让使用者可以用程序语言操作资料库的框架,当程序要求存取资料库的时候就会启用他来把资料库表格和 Model 对应,下面是新增资料的做法,会用到 DbContext 操作,语法相当简单:

_context.Add(product1); //新增物品1
_context.Add(product2); //新增物品2
_context.SaveChanges(); //储存更新

保存机制 EF Core 都已经处理得很好了,如果 product1 成功但 product2 失败的话 EF Core 会把两个动作都 ROLLBACK 保证资料完整性。


HttpGet 和 HttpPost

这两个都是在HTTP协定中定义的方法,是用户端和服务器端处理传值的方法
在实务上两者都能达到传值的效果但在本质上有所不同:

以寄信来比喻

  • GET — 相当於明信片,价格便宜,但所有资料会暴露在信封上。
  • POST — 则相当於装信封的信件,会把资料包装在封包里传送,对比GET来的安全,但也需要较多资源。

基於这样的特性,我们通常会把GET拿来做查询资料这种安全性需求较低的操作,
POST则是拿来做安全性需求高的表单新增修改之类的动作,以防止别人直接从网址攻击。


以程序码来看 MVC

掌握了上面的观念,就来以 Create 为例,来看看 MVC 怎麽处理新增商品这个行为吧!

打开控制器 ProductsController.cs
就会发现有两个 Create() ,建置出来的注解上有标示这分别为 GET 和 POST 的动作

再来回想一下这张流程图,配合这张图来走一次

GET:

public IActionResult Create()
{
    return View();
}

  第 1 步:使用者用/Products/Create网址访问程序
  第 2 步:控制器进到这里判断不需用到 Model 查询资料,即跳过第 3 4 步
  第 5 步第 6 步:把空白页面传给使用者填资料
  完成了显示画面的 MVC 流程

接着当使用者把表单填好点选送出以後就进行POST
POST:

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("Id,Name,Price")] Product product)
{
    if (ModelState.IsValid)
    {
        _context.Add(product);
        await _context.SaveChangesAsync();
        return RedirectToAction(nameof(Index));
    }
    return View(product);
}

  第 1 步:把表单用 POST 传给控制器
  第 2 步:控制器判断要把表单内容绑定给商品模型
  第 3 步第 4 步:模型透过 EF Core 把商品新增到资料库
  第 5 步第 6 步:控制器回传 Index 页面给使用者
  完成写入资料库的 MVC 流程

由上面的例子可以看到对於使用者来说,就不过是在页面上按下一个按钮罢了, MVC 代表的只是资料的流动处理,千万不用把它想的太难,其他的ListDetailUpdateDelete都可以以此类推,再自己试试看。


MVC 大概讲到这边,明天就准备开始来建立我们的购物网站吧!


<<:  第2砍 - 临阵磨枪

>>:  Unity自主学习(四):如何安装Unity(三)

09 | WordPress 图片区块 Image Block

一般阅读的文章是由标题和段落文字组成,如果是长篇内容,容易让读者感到沉闷。这时候你可以试试适当加入...

【C++】GCD and LCM

我们来看到最大公因数(GCD)及最小公倍数(LCM)啦! 最大公因数顾名思义就是两数或多个数间共同有...

Keil error: #101: “name“ has already been declared in the current scope解决方法

keil编译时发生一连串#101 error问题 出问题程序码范例 #include <std...

Vue.js 从零开始:SPA怎麽改善SEO呢? MVC与关注点分离又是什麽?

上一篇讲到SPA的缺点,Vue是用JvaScript载入後台的数据,并且动态产生元件,SEO只能抓取...

CIA-资安的目标

在Wentz Wu网站上说明,CIA是美国法定目标(PUBLIC LAW 107–347—DEC. ...