檢查自動產生的詳細資料和刪除方法
注意
本教學課程的更新版本可使用最新版的Visual Studio在這裡取得。 新的教學課程會使用ASP.NET Core MVC,以提供本教學課程的許多改進功能。
本教學課程可讓您了解 ASP.NET Core MVC 與控制器和檢視。 Razor Pages 是 ASP.NET Core的新替代方案,這是一種頁面型程式設計模型,可讓建置 Web UI 更容易且更具生產力。 建議您在嘗試使用 MVC 版本之前,先試試 Razor 頁面教學課程。 Razor 頁面教學課程:
- 比較容易學習。
- 涵蓋更多功能。
- 這是新應用程式開發的慣用方法。
在本教學課程的這個部分中,您將檢查自動產生的 Details
和 Delete
方法。
檢查 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 Scaffolding 引擎會新增批註,其中顯示叫用方法的 HTTP 要求。 在此情況下,它是具有三個 GET
URL 區段、 Movies
控制器、 Details
方法和 ID
值的要求。
Code First 可讓您輕鬆地使用 Find
方法搜尋資料。 方法內建的重要安全性功能是程式碼會在程式碼嘗試執行任何動作之前,驗證 Find
方法是否已找到電影。 例如,駭客可能會藉由將連結所建立的 URL 變更 http://localhost:xxxx/Movies/Details/1
為類似 (之類的 http://localhost:xxxx/Movies/Details/12345
URL,或一些不代表實際電影) 的其他值,將錯誤引入網站。 如果您未檢查 Null 電影,Null 電影將會導致資料庫錯誤。
檢查 Delete
和 DeleteConfirmed
方法。
// 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 提示 #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) 需要多載方法,以提供唯一的參數簽章 (方法名稱相同但參數清單不同)。 不過,在這裡您需要兩個 Delete 方法,一個用於 GET,另一個用於 POST,兩者具有相同的參數簽章。 (它們都需要接受單一整數作為參數)。
若要解決此問題,您可以執行一些動作。 其中一個是提供方法不同的名稱。 這是 scaffolding 機制在上述範例採取的方法。 不過,這麼做會導致一個小問題:ASP.NET 會依名稱將 URL 區段與動作方法對應,一旦您重新命名方法,路由通常就會找不到這個方法。 解決辦法正如您看到的這個範例:將 ActionName("Delete")
屬性新增至 DeleteConfirmed
方法。 這會有效地執行路由系統的對應,以便包含 /Delete/ 的 POST 要求 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 應用程式,可儲存在本機 DB 資料庫中的資料。 您可以建立、讀取、更新、刪除和搜尋電影。
後續步驟
建置並測試 Web 應用程式之後,下一個步驟是讓其他人能夠透過網際網路使用。 若要這樣做,您必須將其部署至 Web 主控提供者。 Microsoft 在 免費的 Azure 試用版帳戶中提供最多 10 個網站的免費 Web 裝載。 我建議您接著遵循教學課程,將具有成員資格、OAuth 和SQL Database的安全 ASP.NET MVC 應用程式部署至 Azure。 絕佳的教學課程是 Tom Dykstra 的中繼層級 建立 ASP.NET MVC 應用程式的 Entity Framework 資料模型。 Stackoverflow 和 ASP.NET MVC 論壇 是詢問問題的絕佳位置。 在 Twitter 上追蹤 我 ,以便取得最新教學課程的更新。
歡迎意見反應。
— Rick Anderson twitter: @RickAndMSFT
— Scott Hanselman twitter: @shanselman