在這部分教程中,接下來咱們將討論自動生成的Details和Delete方法。html
打開Movie控制器並查看Details方法。web
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值。sql
Code First 使得您能夠輕鬆的使用Find方法來搜索數據。一個重要的安全功能內置到了方法中。方法首先驗證Find
方法已經找到了一部電影,而後再執行其它代碼。例如,黑客能夠經過更改http://localhost:xxxx/Movies/Details/1到http://localhost:xxxx/Movies/Details/12345 (或某些其它值,不表明實際影片的值)從而使得連接URL 出現錯誤。若是您沒有檢測是否找到了Movie, null Movie會致使出現數據錯誤。數據庫
查看Delete
和DeleteConfirmed
方法。windows
// 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"); }
請注意,Delete
的HTTP Get
方法不會刪除指定的電影,它返回刪除電影的視圖,您能夠在此視圖中提交 (HttpPost
) 刪除電影。若是使用GET 請求執行刪除操做(或者執行編輯操做,建立操做或者更改數據的任何其它操做) 開闢了一個安全漏洞。對此的詳細信息,請參閱斯蒂芬 ・ 瓦爾特的博客ASP.NET MVC Tip #46 ― Don't use Delete Links because they create Security Holes.安全
將刪除數據的HttpPost
方法命名爲惟一簽名或名稱的 DeleteConfirmed
方法。這兩個方法的簽名以下所示:mvc
// GET: /Movies/Delete/5 public ActionResult Delete(int? id) // // POST: /Movies/Delete/5 [HttpPost, ActionName("Delete")] public ActionResult DeleteConfirmed(int id)
公共語言運行時 (CLR)重載方法時,須要方法具備獨特惟一的簽名 (方法名稱相同但不一樣的參數列表)。可是,在這裏您須要兩種刪除方法 ― ― 一個 GET方法和一個POST方法它們都具備相同的簽名。(他們都須要接受一個整數做爲參數)。app
要解決這一點,能夠有幾種辦法。一是使用不一樣的方法名稱。這是框架代碼在前面的示例中所使用的方法。然而,這就帶來了一個小問題: ASP.NET 將部分的 URL按名稱映射到操做方法,若是您重命名了方法,一般Routing將沒法找到該方法。解決方法是您在示例中看到的,將ActionName("Delete")
屬性添加到DeleteConfirmed
方法。這會有效的執行Routing系統的Url映射,這樣一個包含/Delete/的 POST 請求的URL 將找到DeleteConfirmed
方法。框架
另外一個常見的方法,來避免具備相同名稱和簽名的方法,是人爲地改變POST 方法,包括未使用參數的簽名。例如,有些開發人員添加參數類型 FormCollection,FormCollection是會傳遞給 POST 方法的,而後根本不使用此參數:asp.net
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主機。 如經過微軟的free Windows Azure trial account,您能夠部署多達10個Web站點。我建議你??下一步請按照個人教程Deploy a Secure ASP.NET MVC app with Membership, OAuth, and SQL Database to a Windows Azure Web Site,以更深刻了解如何部署。另外,還有一個很好的教程是Tom Dykstra's的中級的Creating an Entity Framework Data Model for an ASP.NET MVC Application. Stackoverflow 和 ASP.NET MVC forums。不管是本節所介紹的知識,仍是 Tom Dykstra's 的中級教程都是爲了幫助你們更好的進行MVC的開發,你們在進行開發的同時也能夠藉助一些開發工具。ComponentOne Studio ASP.NET MVC 是一款針對 MVC 平臺的控件包,它與 Visual Studio 無縫集成,徹底與 MVC6 和 ASP.NET 5.0 兼容,將大幅提升工做效率。
提出問題的好地方:StackOverflow的ASP.NET MVC的論壇或者GCDN的Web軟件開發討論區。請關注咱們的博客,這樣你就能夠得到最新教程的更新信息流。
任何意見,歡迎反饋。