ASP.NET MVC 5 - 查询Details和Delete方法

在这部分教程中,接下来咱们将讨论自动生成的Details和Delete方法。html

查询Details和Delete方法

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

clip_image002

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值。sql

Code First 使得您能够轻松的使用Find方法来搜索数据。一个重要的安全功能内置到了方法中。方法首先验证Find方法已经找到了一部电影,而后再执行其它代码。例如,黑客能够经过更改http://localhost:xxxx/Movies/Details/1http://localhost:xxxx/Movies/Details/12345 (或某些其它值,不表明实际影片的值)从而使得连接URL 出现错误。若是您没有检测是否找到了Movie, null Movie会致使出现数据错误。数据库

查看DeleteDeleteConfirmed方法。windows

// 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");
}

请注意,DeleteHTTP Get 方法不会删除指定的电影,它返回删除电影的视图,您能够在此视图中提交 (HttpPost) 删除电影。若是使用GET 请求执行删除操做(或者执行编辑操做,建立操做或者更改数据的任何其它操做) 开辟了一个安全漏洞。对此的详细信息,请参阅斯蒂芬 ・ 瓦尔特的博客ASP.NET MVC Tip #46 ― Don't use Delete Links because they create Security Holes.安全

将删除数据的HttpPost方法命名为惟一签名或名称的 DeleteConfirmed 方法。这两个方法的签名以下所示:mvc

// GET: /Movies/Delete/5
public ActionResult Delete(int? id)
//
// POST: /Movies/Delete/5
[HttpPost, ActionName("Delete")]
public ActionResult DeleteConfirmed(int id)

公共语言运行时 (CLR)重载方法时,须要方法具备独特惟一的签名 (方法名称相同但不一样的参数列表)。可是,在这里您须要两种删除方法 ― ― 一个 GET方法和一个POST方法它们都具备相同的签名。(他们都须要接受一个整数做为参数)。app

要解决这一点,能够有几种办法。一是使用不一样的方法名称。这是框架代码在前面的示例中所使用的方法。然而,这就带来了一个小问题: ASP.NET 将部分的 URL按名称映射到操做方法,若是您重命名了方法,一般Routing将没法找到该方法。解决方法是您在示例中看到的,将ActionName("Delete")属性添加到DeleteConfirmed 方法。这会有效的执行Routing系统的Url映射,这样一个包含/Delete/的 POST 请求的URL 将找到DeleteConfirmed 方法。框架

另外一个常见的方法,来避免具备相同名称和签名的方法,是人为地改变POST 方法,包括未使用参数的签名。例如,有些开发人员添加参数类型 FormCollectionFormCollection是会传递给 POST 方法的,而后根本不使用此参数:asp.net

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 数据库中存储数据。您能够建立、 读取、 更新、 删除和搜索电影。

clip_image004

下一步

在您构建和测试一个Web应用程序以后,下一步就是将其提供给其余人,以使得经过互联网访问。要作到这一点,你须要将它部署到一个Web主机。 如经过微软的free Windows Azure trial account,您能够部署多达10个Web站点。我建议你??下一步请按照个人教程Deploy a Secure ASP.NET MVC app with Membership, OAuth, and SQL Database to a Windows Azure Web Site,以更深刻了解如何部署。另外,还有一个很好的教程是Tom Dykstra's的中级的Creating an Entity Framework Data Model for an ASP.NET MVC Application. StackoverflowASP.NET MVC forums不管是本节所介绍的知识,仍是 Tom Dykstra's 的中级教程都是为了帮助你们更好的进行MVC的开发,你们在进行开发的同时也能够借助一些开发工具。ComponentOne Studio ASP.NET MVC 是一款针对 MVC 平台的控件包,它与 Visual Studio 无缝集成,彻底与 MVC6 和 ASP.NET 5.0 兼容,将大幅提升工做效率。

提出问题的好地方:StackOverflow的ASP.NET MVC的论坛或者GCDN的Web软件开发讨论区。请关注咱们的博客,这样你就能够得到最新教程的更新信息流。

任何意见,欢迎反馈。

相关文章
相关标签/搜索