共用方式為


檢驗自動產生的詳細資料和刪除方法

作者:Rick Anderson

注意

本教學課程的更新版本可在此取得,它使用最新版的 Visual Studio。 新的教學課程會使用 ASP.NET Core MVC,它在本教學課程提供多種改良。

本教學課程可讓您了解 ASP.NET Core MVC 與控制器和檢視。 Razor 頁面是 ASP.NET Core 中的新替代方案,它是以頁面為基礎的程式設計模型,可讓 Web UI 的建立更容易且更有效率。 建議您在嘗試使用 MVC 版本之前,先試試 Razor 頁面教學課程。 Razor 頁面教學課程:

  • 比較容易學習。
  • 涵蓋更多功能。
  • 是開發新應用程式的建議方法。

在教學課程的這個部分,您將檢驗自動產生的 DetailsDelete 方法。

檢查 Details 和 Delete 方法

開啟 Movie 控制器,並檢驗 Details 方法。

螢幕擷取畫面所示為 MoviesController.cs 索引標籤。在 [建立] 下拉式功能表中,[詳細資料] 以紅色圈選。

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 要求。 在此例中,它是含有 Movies 控制器、Details 方法和 ID 值這三個 URL 區段的 GET 要求。

Code First 可讓您輕鬆使用 Find 方法來搜尋資料。 此方法內建的一項重要安全性功能是,程式碼會先驗證 Find 方法是否已找到電影,之後程式碼才會嘗試對它執行任何動作。 比方說,駭客可能會將透過 http://localhost:xxxx/Movies/Details/1 連結建立的 URL 變更為類似 http://localhost:xxxx/Movies/Details/12345 (或不代表實際電影的其他值),導致站台發生錯誤。 如果您未勾選 Null 的電影,Null 的電影會導致資料庫錯誤。

檢查 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 要求 (或是執行相關編輯作業、建立作業或任何會變更資料的其他作業),則會造成安全性漏洞。

我們將可刪除資料的 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,兩者都具有相同的參數簽章 (它們都需要接受單一整數作為參數)。

若要解決此問題,您可以執行幾項動作。 其中一種是為方法提供不同的名稱。 這是 scaffolding 機制在上述範例採取的方法。 不過,這麼做會導致一個小問題:ASP.NET 會依名稱將 URL 區段與動作方法對應,一旦您重新命名方法,路由通常就會找不到這個方法。 解決辦法正如您看到的這個範例:將 ActionName("Delete") 屬性新增至 DeleteConfirmed 方法。 此方法會有效執行路由系統的對應,以便讓在 POST 要求中含有 /Delete/ 的 URL 找到 DeleteConfirmed 方法。

另一個避免問題的常見方法是以人為方式變更 POST 方法的簽章,藉此加入未使用的參數。 舉例來說,某些開發人員會新增參數類型 FormCollection 來傳遞至 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 資料庫中。 您可建立、讀取、更新、刪除和搜尋電影。

螢幕擷取畫面所示為「MVC 電影搜尋」索引頁面。

後續步驟

建置並測試 Web 應用程式之後,下一個步驟是讓其他人能夠透過網際網路使用。 若要達成此目的,您必須將它部署至 Web 主機服務提供者。 Microsoft 在免費的 Azure 試用版帳戶為最多 10 個網站提供免費 Web 主機。 建議您接下來按照教學課程使用成員資格、OAuth 和 SQL Database 將安全的 ASP.NET MVC 應用程式部署至 Azure 來操作。 Tom Dykstra 的中繼層級為 ASP.NET MVC 應用程式建立 Entity Framework 資料模型是極佳的教學課程。 StackoverflowASP.NET MVC 論壇 很適合用於發問。 在 twitter 上追蹤,這樣您就可以取得最新教學課程的更新。

歡迎提供意見。

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