1. 程式人生 > >ASP.NET Core 中文文件 第二章 指南(4.10)檢查自動生成的Detail方法和Delete方法

ASP.NET Core 中文文件 第二章 指南(4.10)檢查自動生成的Detail方法和Delete方法

開啟 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 從 改成類似於 (或者其他非實際電影記錄的值),從而給網站帶來錯誤。如果您不檢查影片是否為空,應用程式將會丟擲異常。

檢視 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方法

開啟 Movie 控制器並檢視 Details 方法: // GET: Movies/Details/5 public async Task<IActionResult> Details(int? id) { if (id == null) { return No

ASP.NET Core 中文 第二 指南4.1ASP.NET Core MVC 與 Visual Studio 入門

這篇教程將告訴你如何使用 Visual Studio 2015 構建一個 ASP.NET Core MVC Web 應用程式的基礎知識。 安裝 Visual Studio 和 .NET Core 安裝 Visual Studio Community 2015。選擇 Community 下載並執行預設安裝

ASP.NET Core 中文 第二 指南4.6Controller 方法與檢視

我們已經初步的建立了一個 movie 應用程式,但是展示並不理想。我們不希望看到 release date 欄位顯示時間並且 ReleaseDate 應該是兩個單詞。 開啟 Models/Movie.cs 檔案並新增下面高亮的程式碼行: public class Movie { public in

ASP.NET Core 中文 第二 指南4.5使用 SQL Server LocalDB

ApplicationDbContext 類負責連線資料庫並將 Movie 物件和資料記錄進行對映。 Startup.cs 檔案中,資料庫上下文是在 ConfigureServices 方法中用 Dependency Injection 容器進行註冊的。 // This method gets called

ASP.NET Core 中文 第二 指南1用 Visual Studio Code 在 macOS 上建立首個 ASP.NET Core 應用程式

本文已更新,最後更新於2017年4月28日 聯絡我們: QQ Group: 436035237 (dotNet Core Studying Group) GitHub Repo: https://github.com/dotnetcore/aspnetcore-doc-cn/ 以下為老翻譯存檔 本節將

ASP.NET Core 中文 第二 指南2用 Visual Studio ASP.NET Core MVC 建立首個 Web API

HTTP 協議不僅僅提供網頁服務。它也是一個構建公開服務和資料 API 的強大平臺。HTTP 協議是簡單、靈活、無處不在的。幾乎你能想到的任何平臺上都有 HTTP 支援,所以 HTTP 服務能夠傳送到多種客戶端, 包括瀏覽器,移動裝置和傳統的桌面應用程式。 在本教程中,你將建立一個簡單的 Web API 來

ASP.NET Core 中文 第二 指南 09 使用 Swagger 生成 ASP.NET Web API 線上幫助測試

對於開發人員來說,構建一個消費應用程式時去了解各種各樣的 API 是一個巨大的挑戰。 在你的 Web API 專案中使用 Swagger 的 .NET Core 封裝 Swashbuckle 可以幫助你建立良好的文件和幫助頁面。 Swashbuckle 可以通過修改 Startup.cs 作為一組 NuGe

ASP.NET Core 中文 第二 指南8 使用 dotnet watch 開發 ASP.NET Core 應用程式

本文已更新,最後更新於2017年4月27日 以下為老翻譯存檔 介紹 dotnet watch 是一個開發階段在原始檔發生變動的情況下使用 dotnet 命令的工具。 當代碼發生變動的時候可以用來執行編譯,執行測試,或者釋出操作。 在本教程中,我們將使用一個現有的計算兩個數字之和以及乘積的 WebAp

ASP.NET Core 中文 第二 指南5 在 Nano Server 上執行ASP.NET Core

注意:本教程使用 Windows Server Technical Preview 5 的預發行版本的 Nano Server 安裝選項。 你可以在虛擬硬碟映像中用來內部演示和評估,但不能在生產環境中使用該軟體。可通過 https://go.microsoft.com/fwlink/?LinkId=624

ASP.NET Core 中文 第二 指南3用 Visual Studio 釋出一個 Azure 雲 Web 應用程式

設定開發環境 注意 如果你的機器之前任何依賴都沒有安裝過,SDK 的安裝時間將會超過30分鐘。 建立一個 Web 應用程式 在 Visual Studio 的 Start 頁面,點選 New Project。 另外,你也可以通過選單新建專案。點選 File > New > Proje

ASP.NET Core 中文 第四 MVC4.6Areas區域

Areas 是 ASP.NET MVC 用來將相關功能組織成一組單獨名稱空間(路由)和資料夾結構(檢視)的功能。使用 Areas 建立層次結構的路由,是通過新增另一個路由引數 area 到 Controller 和 action。 Areas 提供了一種把大型 ASP.NET Core MVC Web 應用

ASP.NET Core 中文 第五 測試5.2整合測試

整合測試確保應用程式的元件組裝在一起時正常工作。 ASP.NET Core支援使用單元測試框架和可用於處理沒有網路開銷請求的內建測試的網路主機整合測試。 章節: 整合測試介紹 整合測試驗證應用程式不同的部位是否正確地組裝在一起。不像單元測試,整合測試經常涉及到應用基礎設施,如資料庫,檔案系統,網路資源

ASP.NET Core 中文 第四 MVC4.2控制器操作的路由

ASP.NET Core MVC 使用路由 中介軟體 來匹配傳入請求的 URL 並對映到具體的操作。路由通過啟動程式碼或者特性定義。路由描述 URL 路徑應該如何匹配到操作。路由也同樣用於生成響應中返回的 URL(用於連結)。 這篇文章將解釋 MVC 和路由之間的相互作用,以及典型的 MVC 應用程式如何使

ASP.NET Core 中文 第四 MVC4.1Controllers, Actions Action Results

Action 和 action result 是開發者使用 ASP.NET MVC 構建應用程式的基礎部分。 什麼是 Controller 在 ASP.NET MVC 中, 控制器( Controller  )用於定義和聚合操作(Action)的一個集合。操作( 或操作方法 )是控制器中處理入站請求的一個方

ASP.NET Core 中文 第四 MVC2.3格式化響應資料

ASP.NET Core MVC 內建支援對相應資料(response data)的格式化,用來修正格式或生成客戶端指定的格式。 特定格式的操作結果 某些操作結果(Action result)的型別是指定的特定格式,比如 JsonResult 或 ContentResult。Action 可以返回格式化為

ASP.NET Core 中文 第四 MVC4.4依賴注入控制器

ASP.NET Core MVC 控制器應通過它們的構造器明確的請求它們的依賴關係。在某些情況下,單個控制器的操作可能需要一個服務,在控制器級別上的請求可能沒有意義。在這種情況下,你也可以選擇將服務作為 action 方法的引數。 章節: 依賴注入 依賴注入(Dependency injection,

ASP.NET Core 中文 第四 MVC01ASP.NET Core MVC 概覽

ASP.NET Core MVC 是使用模型-檢視-控制器(Model-View-Controller)設計模式構建網頁應用與 API 的豐富的框架。 什麼是 MVC 模式? 模型-檢視-控制器(MVC)架構模式將一個應用區分為三部分主要元件:模型、檢視、與控制器。這種模式有助實現關注分離。使用這種模式,使

ASP.NET Core 中文 第四 MVC4.3過濾器

ASP.NET MVC 過濾器 可在執行管道的前後特定階段執行程式碼。過濾器可以配置為全域性有效、僅對控制器有效或是僅對 Action 有效。 過濾器如何工作? 不同的過濾器型別會在執行管道的不同階段執行,因此它們各自有一套適用場景。根據你實際要解決的問題以及在請求管道中執行的位置來選擇建立不同的過濾器。

ASP.NET Core 中文 第三 原理2中介軟體

章節: 什麼是中介軟體 中介軟體是用於組成應用程式管道來處理請求和響應的元件。管道內的每一個元件都可以選擇是否將請求交給下一個元件、並在管道中呼叫下一個元件之前和之後執行某些操作。請求委託被用來建立請求管道,請求委託處理每一個 HTTP 請求。 請求委託通過使用 IApplicationBuilder

ASP.NET Core 中文 第四 MVC3.8檢視中的依賴注入

ASP.NET Core 支援在檢視中使用 依賴注入 。這將有助於提供檢視專用的服務,比如本地化或者僅用於填充檢視元素的資料。你應該儘量保持控制器和檢視間的關注點分離(separation of concerns)。你的檢視所顯示的大部分資料應該從控制器傳入。 章節: 一個簡單的示例 你可以使用 @i