ASP.NET MVC 5 - 查詢Details和Delete方法

在這部分教程中,接下來咱們將討論自動生成的Details和Delete方法。html

查詢Details和Delete方法

打開Movie控制器並查看Details方法。web

clip_image002

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/1http://localhost:xxxx/Movies/Details/12345 (或某些其它值,不表明實際影片的值)從而使得連接URL 出現錯誤。若是您沒有檢測是否找到了Movie, null Movie會致使出現數據錯誤。數據庫

查看DeleteDeleteConfirmed方法。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");
}

請注意,DeleteHTTP 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 方法,包括未使用參數的簽名。例如,有些開發人員添加參數類型 FormCollectionFormCollection是會傳遞給 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 數據庫中存儲數據。您能夠建立、 讀取、 更新、 刪除和搜索電影。

clip_image004

下一步

在您構建和測試一個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. StackoverflowASP.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軟件開發討論區。請關注咱們的博客,這樣你就能夠得到最新教程的更新信息流。

任何意見,歡迎反饋。

相關文章
相關標籤/搜索