博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ASP.NET Core 中文文档 第二章 指南(4.10)检查自动生成的Detail方法和Delete方法
阅读量:7124 次
发布时间:2019-06-28

本文共 2613 字,大约阅读时间需要 8 分钟。

原文

作者
翻译
校对 、

打开 Movie 控制器并查看 Details 方法:

// GET: Movies/Details/5public async Task
Details(int? id){ if (id == null) { return NotFound(); } var movie = await _context.Movie.SingleOrDefaultAsync(m => m.ID == id); if (movie == null) { return NotFound(); } return View(movie);}

创建这个 action 方法的 MVC 基架引擎添加了一条注释给出了会调用这个方法的 HTTP 请求。在这个例子中是一个有三个URL段的GET请求, Movies 控制器, Details 方法和 id 参数值。回顾一下 Startup 里定义的这些段。

app.UseMvc(routes =>    {        routes.MapRoute(            name: "default",            template: "{controller=Home}/{action=Index}/{id?}");//手工高亮    });

代码先行(Code First)模式使用 SingleOrDefaultAsync 方法更易于数据搜索。这个方法包含的一个重要安全功能,就是在代码尝试用电影记录做任何操作之前确保查找方法已经找到了一条电影记录。例如,黑客可以把产生的链接 URL 从 改成类似于 (或者其他非实际电影记录的值),从而给网站带来错误。如果您不检查影片是否为空,应用程序将会抛出异常。

查看 Delete 方法和 DeleteConfirmed 方法

// GET: Movies/Delete/5public async Task
Delete(int? id){ if (id == null) { return NotFound(); } var movie = await _context.Movie.SingleOrDefaultAsync(m => m.ID == id); if (movie == null) { return NotFound(); } return View(movie);}// POST: Movies/Delete/5[HttpPost, ActionName("Delete")][ValidateAntiForgeryToken]public async Task
DeleteConfirmed(int id){ var movie = await _context.Movie.SingleOrDefaultAsync(m => m.ID == id); _context.Movie.Remove(movie); await _context.SaveChangesAsync(); return RedirectToAction("Index");}

需要注意的是 HTTP GET Delete 方法不删除指定的影片,它返回一个你可以提交 (HttpPost) 删除操作的 Movie 的视图。如果在对 GET 请求的响应中执行删除操作(或者编辑,创建,或任何其他更改数据的操作)将会引入一个安全漏洞。

真正删除数据的 [HttpPost] 方法被命名为 DeleteConfirmed ,给这个 HTTP POST 方法一个唯一的签名或名称。这两个方法的签名如下:

// GET: Movies/Delete/5public async Task
Delete(int? id)// POST: Movies/Delete/5public async Task
DeleteConfirmed(int id)

公共语言运行时(CLR)要求重载方法有一个唯一的参数签名(相同的方法名,但不同的参数列表)。然而,在这里你需要两个 Delete 方法 – 一个 GET 请求一个 POST 请求 – 并且它们都具有相同的参数签名。(它们都需要接受一个整数作为参数)。

有两种方案可以解决该问题,其中一种方法是,赋予方法不同的名称。这就是基架机制在前面的例子所做的事情。但是,这个方法引入了一个小问题: ASP.NET 利用名字将 URL 段映射到 action 方法,如果你重命名一个方法,路由通常将无法找到该方法。解决的办法就是你在例子中看到的,就是为 DeleteConfirmed 方法添加 ActionName("Delete") 特性。该特性为路由系统执行映射,所以一个 POST 请求的包含 /Delete/ 的 URL 会找到 DeleteConfirmed 的方法。

对于具有相同名称和参数签名的方法,另一种常见的的解决办法是通过人为的改变 POST 方法的签名,即包含一个附加的(未使用)参数。这就是我们在前面文章中已经添加的 unused 的参数。在这里你可以对 [HttpPost] Delete 方法采用同样的解决办法:

// POST: Movies/Delete/5[HttpPost][ValidateAntiForgeryToken]public async Task
Delete(int id, bool notUsed){ var movie = await _context.Movie.SingleOrDefaultAsync(m => m.ID == id); _context.Movie.Remove(movie); await _context.SaveChangesAsync(); return RedirectToAction("Index");}

转载地址:http://lnael.baihongyu.com/

你可能感兴趣的文章
Docker多容器连接-以Nginx+PHP为例
查看>>
node.js http.serverResponse
查看>>
让我们聊聊脑裂这事情
查看>>
入侵检测 - AIDE高级入侵检测平台
查看>>
Getting unknown property: yii\db\ActiveQuery::name
查看>>
CentOS 6.5 双网卡配置一个上外网一个接局域网
查看>>
linux手动释放cached内存
查看>>
链表的基本操作
查看>>
arm-2009q1-203-arm-none-linux-gnueabi 安装
查看>>
Spring中的统一异常处理方式
查看>>
wemall 2.0 beta 公测版
查看>>
Mac别名以及自定义命令
查看>>
UIButton扩大响应区域
查看>>
scp详解
查看>>
SpringMVC的请求
查看>>
Hibernate学习笔记第一天 带Hibernate4架包
查看>>
hibernate一些方法的运用
查看>>
sublimetext编译Lua的配置
查看>>
【日积月累】C/C++可变参数函数的实现
查看>>
webSocket实现扫码登录
查看>>