檢驗自動產生的詳細資料和刪除方法
注意
本教學課程的更新版本可在此取得,它使用最新版的 Visual Studio。 新的教學課程會使用 ASP.NET Core MVC,它在本教學課程提供多種改良。
本教學課程可讓您了解 ASP.NET Core MVC 與控制器和檢視。 Razor 頁面是 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 要求。 在此例中,它是含有 Movies
控制器、Details
方法和 ID
值這三個 URL 區段的 GET
要求。
Code First 可讓您輕鬆使用 Find
方法來搜尋資料。 此方法內建的一項重要安全性功能是,程式碼會先驗證 Find
方法是否已找到電影,之後程式碼才會嘗試對它執行任何動作。 比方說,駭客可能會將透過 http://localhost:xxxx/Movies/Details/1
連結建立的 URL 變更為類似 http://localhost:xxxx/Movies/Details/12345
(或不代表實際電影的其他值),導致站台發生錯誤。 如果您未勾選 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 要求 (或是執行相關編輯作業、建立作業或任何會變更資料的其他作業),則會造成安全性漏洞。
我們將可刪除資料的 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 資料庫中。 您可建立、讀取、更新、刪除和搜尋電影。
後續步驟
建置並測試 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