• ASP.NET MVC 5 入门(11):检查 Details 和 Delete 方法


    原文:https://docs.microsoft.com/zh-cn/aspnet/mvc/overview/getting-started/introduction/examining-the-details-and-delete-methods

    作者: Rick Anderson

    ASP.NET MVC 5 入门

    ASP.NET MVC 5 简介

    此教程的更新版本可在此处使用最新版本的Visual Studio 新教程使用ASP.NET CORE MVC,这在本教程中提供了许多改进。

    本教程介绍具有控制器和视图的 ASP.NET Core MVC。 Razor 页面是 ASP.NET Core 2.0 中的一个新选择,它是基于页面的编程模型,可以实现更简单、更高效地生成 Web UI。 建议先尝试 Razor 页面教程,再使用 MVC 版本。 Razor 页面教程:

    • 易于关注。
    • 涵盖更多功能。
    • 是开发新应用程序的首选方法。

    以下教程系列介绍了GitHub上的 ASP.NET MVC: Source

    在本教程的此部分,您将检查自动生成的 DetailsDelete 方法。

    一、检查 Details 和 Delete 方法

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

    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 基架引擎添加注释,该注释显示调用方法的 HTTP 请求。 在这种情况下,它是一个 GET 请求,其中包含三个 URL 段、Movies 控制器、Details 方法和 ID 值。

    Code First 使用 Find 方法可以轻松地搜索数据。 内置于方法中的一个重要的安全功能是,代码验证 Find 方法在代码尝试使用影片之前是否找到了电影。 例如,黑客可以通过将 http://localhost:xxxx/Movies/Details/1 链接创建的 URL 更改为类似于 http://localhost:xxxx/Movies/Details/12345 (或其他不表示实际电影的值),将错误引入到站点中。 如果未检查是否有空电影,空电影会导致数据库错误。

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

    请注意,HTTP GET Delete 方法不会删除指定的电影,它会返回电影的视图,你可以在其中提交(HttpPost)删除。 执行删除操作以响应 GET 请求(或者说,执行编辑操作、创建操作或更改数据的任何其他操作)会打开安全漏洞。 有关此操作的详细信息,请参阅 Stephen Walther 的博客文章ASP.NET MVC Tip #46 —不要使用删除链接,因为它们创建了安全漏洞

    删除数据的 HttpPost 方法命名为 DeleteConfirmed,以便为 HTTP POST 方法提供一个唯一的签名或名称。 下面显示了两个方法签名:

    // 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 段映射到操作方法,如果重命名方法,则路由通常无法找到该方法。 该示例中也提供了解决方案,即向 ActionName("Delete") 方法添加 DeleteConfirmed 属性。 这将有效地为路由系统执行映射,以便包含 POST 请求的 /Delete/ 的 URL 将查找 DeleteConfirmed 方法。

    避免使用具有相同名称和签名的方法的问题的另一种常见方法是:人为更改 POST 方法的签名以包含未使用的参数。 例如,某些开发人员添加了一个传递给 POST 方法的参数类型 FormCollection,只是不使用参数:

    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 应用程序,它将数据存储在本地数据库中。 你可以创建、读取、更新、删除和搜索电影。

    三、后续步骤

    生成并测试 web 应用程序后,下一步就是使其可供其他人通过 Internet 使用。 为此,必须将其部署到 web 宿主提供程序。 Microsoft 为免费的Azure 试用帐户提供免费的 web 托管,最多10个网站。 建议你接下来按照教程使用成员资格、OAuth 和 SQL 数据库将安全的 ASP.NET MVC 应用程序部署到 Azure 好的教程是 Tom Dykstra 为ASP.NET MVC 应用程序创建实体框架数据模型 StackoverflowASP.NET MVC 论坛是提出问题的好地方。 请在 twitter 上关注,以便可以在我的最新教程中获取更新。

    欢迎提供反馈。

    - Rick Anderson twitter: @RickAndMSFT
    - Scott Hanselman twitter: @shanselman

  • 相关阅读:
    GeoMesa Java API-写入与查询数据
    GeoMesa命令行,索引概述
    HBase,以及GeoMesa设计基于HBase的设计分析,从数据模型到典型查询场景,最后进行RowKey设计
    笔趣看小说Python3爬虫抓取
    python网络爬虫
    Kafka客户端Producer与Consumer
    ScalikeJDBC,操作mysql数据,API
    mysqldb
    Python 反射
    Go 类型转换
  • 原文地址:https://www.cnblogs.com/springsnow/p/13264834.html
Copyright © 2020-2023  润新知