原文 Examining the Details and Delete methods
作者 Rick Anderson
翻译 谢炀(Kiler)
校对 许登洋(Seay)、姚阿勇(Mr.Yao)

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

// GET: Movies/Details/5
public async Task<IActionResult> 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 从 http://localhost:xxxx/Movies/Details/1 改成类似于 http://localhost:xxxx/Movies/Details/12345 (或者其他非实际电影记录的值),从而给网站带来错误。如果您不检查影片是否为空,应用程序将会抛出异常。

查看 Delete 方法和 DeleteConfirmed 方法

// GET: Movies/Delete/5
public async Task<IActionResult> 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<IActionResult> 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/5
public async Task<IActionResult> Delete(int? id)// POST: Movies/Delete/5
public async Task<IActionResult> 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<IActionResult> 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");
}

返回目录

ASP.NET Core 中文文档 第二章 指南(4.10)检查自动生成的Detail方法和Delete方法相关推荐

  1. ASP.NET Core 中文文档 第二章 指南(4.4)添加 Model

    原文:Adding a model 作者:Rick Anderson 翻译:娄宇(Lyrics) 校对:许登洋(Seay).孟帅洋(书缘).姚阿勇(Mr.Yao).夏申斌 在这一节里,你将添加一些类来 ...

  2. ASP.NET Core 中文文档 第二章 指南(4.5)使用 SQL Server LocalDB

    原文:Working with SQL Server LocalDB 作者:Rick Anderson 翻译: 魏美娟(初见) 校对: 孟帅洋(书缘).张硕(Apple).许登洋(Seay) Appl ...

  3. ASP.NET Core 中文文档 第二章 指南(4.3)添加 View

    原文:Adding a view 作者:Rick Anderson 翻译:魏美娟(初见) 校对:赵亮(悲梦).高嵩(Jack).娄宇(Lyrics).许登洋(Seay).姚阿勇(Dr.Yao) 本节将 ...

  4. ASP.NET Core 中文文档 第一章 入门

    原文:Getting Started 翻译:娄宇(Lyrics) 校对:刘怡(AlexLEWIS) 1.安装 .NET Core 2.创建一个新的 .NET Core 项目: mkdir aspnet ...

  5. ASP.NET Core 中文文档 第三章 原理(5)错误处理

    原文:Error Handling 作者:Steve Smith 翻译:谢炀(Kiler) 校对:高嵩(jack2gs).何镇汐 当你的ASP.NET应用发生错误的时候, 你可以采用本文所述的各种方法 ...

  6. ASP.NET Core 中文文档 第三章 原理(3)静态文件处理

    原文:Working with Static Files 作者:Rick Anderson 翻译:刘怡(AlexLEWIS) 校对:谢炀(kiler398).许登洋(Seay).孟帅洋(书缘) 静态文 ...

  7. ASP.NET Core中使用GraphQL - 第二章 中间件

    前文:ASP.NET Core中使用GraphQL - 第一章 Hello World 中间件 如果你熟悉ASP.NET Core的中间件,你可能会注意到之前的博客中我们已经使用了一个中间件, 这个中 ...

  8. ASP.NET Core 中文文档 第三章 原理(1)应用程序启动

    原文:Application Startup 作者:Steve Smith 翻译:刘怡(AlexLEWIS) 校对:谢炀(kiler398).许登洋(Seay) ASP.NET Core 为你的应用程 ...

  9. ASP.NET Core 中文文档 第三章 原理(13)管理应用程序状态

    原文:Managing Application State 作者:Steve Smith 翻译:姚阿勇(Dr.Yao) 校对:高嵩 在 ASP.NET Core 中,有多种途径可以对应用程序的状态进行 ...

最新文章

  1. ZOJ 2334 HDU 1512 Monkey King
  2. Netmeeting的四个端口
  3. ListView控件的基本使用(方式一:使用ArrayAdapter适配器实现)
  4. 拒做工具人!教你一键快速部署应用到容器镜像仓库
  5. matlab repmate,MATLAB中“repmat”与“cat”函数的用法
  6. 一道GCD LCM题目题解
  7. ruby hash方法_Ruby中带有示例的Hash.default(key = nil)方法
  8. Linux系统IP地址
  9. USACO3.22Stringsobits
  10. 基于JAVA+SpringMVC+MYSQL的ktv预订管理系统
  11. TypeError: softmax() got an unexpected keyword argument 'axis'
  12. 通过pgpool-II实现PostgreSQL数据库服务高可用
  13. QCA9377驱动调试
  14. office visio 替代_10个Linux中受欢迎的开源Visio替代品
  15. 易语言短信接口_易语言调用腾讯云发送短信例子源码
  16. java 实现屏幕录像_用JAVA捕获屏幕、屏幕录像、播放
  17. 2019年下半年网络管理员考试上午真题(答案+解析)
  18. 计算机硬件的五大组成部分
  19. centos 20T硬盘(超过16T)分区和格式化
  20. 谷歌表格图表 横坐标 滚动_JS图表:Google表格

热门文章

  1. SpringBoot实战(一):使用Lombok简化你的代码
  2. 一样的打游戏,不一样的酷
  3. 自动驾驶公司Momenta完成B2轮融资,凯辉领投GGV跟投
  4. springboot如何使用外部tomcat容器
  5. 如何加精准粉丝,一个巧妙实用的方法!
  6. 如何让Android手机远离间谍软件?看这里
  7. Python——内置类型
  8. Ubuntu自定义服务
  9. 【CF 应用开发大赛】智能静音android应用
  10. HTTP的请求与响应问题(没有了CSDN,暂时把这里当作论坛了)