🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# ASP.NET MVC 5 - 查询Details和Delete方法 在这部分教程中,接下来我们将讨论自动生成的Details和Delete方法。 ## 查询Details和Delete方法 打开Movie控制器并查看Details方法。 ![](https://box.kancloud.cn/2016-01-02_568736b9ecf56.jpg) ``` public ActionResult Details(int? id) { if (id == null) { return new HttpStatusCodeResult(HttpStatusCode.BadRequest); } Movie movie = db.Movies.Find(id); if (movie == null) { return HttpNotFound(); } return View(movie); } ``` MVC scaffolding引擎增加了一个注释表明,在调用的HTTP请求方法中,GET请求有三个URL段,Movies控制器,Details方法和ID值。 Code First 使得您可以轻松的使用[Find](http://msdn.microsoft.com/en-us/library/system.data.entity.dbset.find(v=vs.103).aspx)方法来搜索数据。一个重要的安全功能内置到了方法中。方法首先验证`Find`方法已经找到了一部电影,然后再执行其它代码。例如,黑客可以通过更改_http://localhost:xxxx/Movies/Details/1_到_http://localhost:xxxx/Movies/Details/12345_ (或某些其它值,不代表实际影片的值)从而使得链接URL 出现错误。如果您没有检测是否找到了Movie, null Movie会导致出现数据错误。 查看`Delete`和`DeleteConfirmed`方法。 ``` // GET: /Movies/Delete/5 public ActionResult Delete(int? id) { if (id == null) { return new HttpStatusCodeResult(HttpStatusCode.BadRequest); } Movie movie = db.Movies.Find(id); if (movie == null) { return HttpNotFound(); } return View(movie); } // POST: /Movies/Delete/5 [HttpPost, ActionName("Delete")] [ValidateAntiForgeryToken] public ActionResult DeleteConfirmed(int id) { Movie movie = db.Movies.Find(id); db.Movies.Remove(movie); db.SaveChanges(); return RedirectToAction("Index"); } ``` 请注意,`Delete`的`HTTP Get` 方法不会删除指定的电影,它返回删除电影的视图,您可以在此视图中提交 (`HttpPost`) 删除电影。如果使用GET 请求执行删除操作(或者执行编辑操作,创建操作或者更改数据的任何其它操作) 开辟了一个安全漏洞。对此的详细信息,请参阅斯蒂芬 · 瓦尔特的博客[ASP.NET MVC Tip #46 — Don't use Delete Links because they create Security Holes](http://stephenwalther.com/blog/archive/2009/01/21/asp.net-mvc-tip-46-ndash-donrsquot-use-delete-links-because.aspx). 将删除数据的`HttpPost`方法命名为唯一签名或名称的 `DeleteConfirmed` 方法。这两个方法的签名如下所示: ``` // GET: /Movies/Delete/5 public ActionResult Delete(int? id) // // POST: /Movies/Delete/5 [HttpPost, ActionName("Delete")] public ActionResult DeleteConfirmed(int id) ``` 公共语言运行时 (CLR)重载方法时,需要方法具有独特唯一的签名 (方法名称相同但不同的参数列表)。但是,在这里您需要两种删除方法 — — 一个 GET方法和一个POST方法它们都具有相同的签名。(他们都需要接受一个整数作为参数)。 要解决这一点,可以有几种办法。一是使用不同的方法名称。这是框架代码在前面的示例中所使用的方法。然而,这就带来了一个小问题: ASP.NET 将部分的 URL按名称映射到操作方法,如果您重命名了方法,通常Routing将无法找到该方法。解决方法是您在示例中看到的,将`ActionName("Delete")`属性添加到`DeleteConfirmed` 方法。这会有效的执行Routing系统的Url映射,这样一个包含_/Delete/_的 POST 请求的URL 将找到`DeleteConfirmed` 方法。 另一个常见的方法,来避免具有相同名称和签名的方法,是人为地改变POST 方法,包括未使用参数的签名。例如,有些开发人员添加参数类型 [FormCollection](http://msdn.microsoft.com/en-us/library/system.web.mvc.formcollection.aspx),[FormCollection](http://msdn.microsoft.com/en-us/library/system.web.mvc.formcollection.aspx)是会传递给 POST 方法的,然后根本不使用此参数: ``` public ActionResult Delete(FormCollection fcNotUsed, int id = 0) { Movie movie = db.Movies.Find(id); if (movie == null) { return HttpNotFound(); } db.Movies.Remove(movie); db.SaveChanges(); return RedirectToAction("Index"); } ``` ## 小结 您现在有一个完整的 ASP.NET MVC 应用程序并在本地的 DB 数据库中存储数据。您可以创建、 读取、 更新、 删除和搜索电影。 ![](https://box.kancloud.cn/2016-01-02_568736ba14623.jpg) ## 下一步 在您构建和测试一个Web应用程序之后,下一步就是将其提供给其他人,以使得通过互联网访问。要做到这一点,你需要将它部署到一个Web主机。 如通过微软的[free Windows Azure trial account](http://www.windowsazure.com/en-us/pricing/free-trial/?WT.mc_id=A443DD604),您可以部署多达10个Web站点。我建议你​​下一步请按照我的教程[Deploy a Secure ASP.NET MVC app with Membership, OAuth, and SQL Database to a Windows Azure Web Site](http://www.windowsazure.com/en-us/develop/net/tutorials/web-site-with-sql-database/),以更深入了解如何部署。另外,还有一个很好的教程是Tom Dykstra's的中级的[Creating an Entity Framework Data Model for an ASP.NET MVC Application](http://www.asp.net/entity-framework/tutorials/creating-an-entity-framework-data-model-for-an-asp-net-mvc-application). [Stackoverflow](http://stackoverflow.com/help) 和 [ASP.NET MVC forums](http://forums.asp.net/1146.aspx)。 提出问题的好地方:StackOverflow的ASP.NET MVC的论坛或者[GCDN的Web软件开发讨论区](http://gcdn.gcpowertools.com.cn/showforum-27.html)。请关注[我们的博客](http://www.cnblogs.com/powertoolsteam/),这样你就可以获得最新教程的更新信息流。 任何意见,欢迎反馈。