• ASP.NET MVC 5


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

    2014-4-24阅读412 评论0

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

    查询Details和Delete方法

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

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

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

    查看DeleteDeleteConfirmed方法。

    // 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 方法。这两个方法的签名如下所示:

    // 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 方法,包括未使用参数的签名。例如,有些开发人员添加参数类型 FormCollectionFormCollection是会传递给 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 数据库中存储数据。您可以创建、 读取、 更新、 删除和搜索电影。

    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 ApplicationStackoverflow 和 ASP.NET MVC forums

  • 相关阅读:
    [APIO 2009] Atm
    Codeforces518 D. Ilya and Escalator
    [POJ2096] Collecting bugs
    [ZOJ3329] One Person Game
    [LightOJ1038] Race to 1 Again
    「NOI2003」逃学的小孩
    [HAOI2006] 旅行
    ☆ [POJ2411] Mondriaan's Dream 「状压DP」
    「POJ3311」Hie with the Pie
    「乘法逆元」 学习笔记
  • 原文地址:https://www.cnblogs.com/fx2008/p/4196362.html
Copyright © 2020-2023  润新知