原文連結:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/examining-the-details-and-delete-methods
在這一部分,我們將會來看一下自動產生的Details和Delete方法中的代碼。本文也是ASP.NET 4入門系列的最後一篇。
查看一下Details和Delete方法
開啟Movie的controller來查看一下Details方法。
public ActionResult Details(int id = 0){ Movie movie = db.Movies.Find(id); if (movie == null) { return HttpNotFound(); } return View(movie);}
Code First是的通過Find方法尋找資料變得非常容易。在這個方法中一個重要的安全性方面的特性是代碼在進行任何處理之前會確保Find方法確實找到了相關的電影資料。例如,一個駭客可能通過把超連結中的形如http://localhost:xxxx/Movies/Details/1這樣的URL修改成http://localhost:xxxx/Movies/Details/12345這個樣子(或者是其他一些不代表任何電影資料的值)來給網站引入一些錯誤。如果我們沒有檢查檢索的movie是否為null,可能會引起一個資料庫錯誤。
查看一下Delete和DeleteConfirmed方法。
// GET: /Movies/Delete/5public ActionResult Delete(int id = 0){ Movie movie = db.Movies.Find(id); if (movie == null) { return HttpNotFound(); } return View(movie);}//// POST: /Movies/Delete/5[HttpPost, ActionName("Delete")]public ActionResult DeleteConfirmed(int id = 0){ Movie movie = db.Movies.Find(id); if (movie == null) { return HttpNotFound(); } db.Movies.Remove(movie); db.SaveChanges(); return RedirectToAction("Index");}
注意一下HttpGet版本的Delete方法並沒有刪除指定的資料,僅僅是返回了一個電影的視圖,在這個視圖中你可以通過HttpPost的方式來提交刪除的資料。對於Get請求執行一個刪除操作(或者是一個編輯操作,或者是建立資料的操作,或者任何可能會修改資料的操作)會開啟一個安全性漏洞。關於這方面的更多資訊,請參考Stephen Walther's的部落格ASP.NET MVC Tip #46 — Don't use Delete Links because they create Security Holes.
刪除資料的HttpPost版本的方法名字是DeleteConfirmed,這樣做是為了給HttpPost方法一個唯一的方法簽名。兩個Delete有關的方法簽名如下:
// GET: /Movies/Delete/5public ActionResult Delete(int id = 0)//// POST: /Movies/Delete/5[HttpPost, ActionName("Delete")]public ActionResult DeleteConfirmed(int id = 0)
Common Language Runtime(CLR)要求重載的方法租都有唯一的方法簽名(方法簽名由方法名和參數列表共同組成,如果方法名和參數列表相同,則認為是相同的方法簽名),但是,在這裡我們需要兩個Delete方法——一個是為了響應Get請求,一個響應Post請求——如果兩個方法都命名為Delete的話,兩個方法的簽名就相同了。
為瞭解決這個衝突,我們有好幾種解決方案。一種是為這些方法起不同的名字。這正是Scaffolding機制採用的做法。但是這樣的話會引入另外一個小麻煩:ASP.NET通過URL來映射Controller中的Action,如果我們重新命名了一個方法,路由機制很可能就找不到這個Action了。解決方案就是你在上面的範例程式碼中看到的,為DeleteConfirmed方法添加一個ActionName("Delete")特性。這種方式有效地解決了這個問題,這樣包含了/Delete/字樣的URL的Post請求就會映射到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應用來在一個資料庫中儲存電影相關的資料。我們可以新增,瀏覽,更新,刪除和尋找電影相關資料。
接下來做些什麼
在完成了這個入門系列的學習之後,建議讀者繼續學習中級的Creating an Entity Framework Data Model for an ASP.NET MVC Application and MVC Music Store系列文章,在ASP.NET articles on MSDN中瀏覽相關文章,在http://asp.net/mvc這個網站上通過看視頻和找資料來自學更多關於ASP.NET MVC的知識。並且ASP.NET MVC forums這個論壇是一個問問題的好地方。
本入門系列全部完結。