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

葡萄城技術團隊發表於2014-04-10

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

查詢Details和Delete方法

開啟Movie控制器並檢視Details方法。

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值。

Code First 使得您可以輕鬆的使用Find方法來搜尋資料。一個重要的安全功能內建到了方法中。方法首先驗證Find方法已經找到了一部電影,然後再執行其它程式碼。例如,黑客可以通過更改http://localhost:xxxx/Movies/Details/1http://localhost:xxxx/Movies/Details/12345 (或某些其它值,不代表實際影片的值)從而使得連結URL 出現錯誤。如果您沒有檢測是否找到了Movie, null Movie會導致出現資料錯誤。

檢視DeleteDeleteConfirmed方法。

// 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 方法。這兩個方法的簽名如下所示:

// GET: /Movies/Delete/5

public ActionResult Delete(int? id)

//

// POST: /Movies/Delete/5

[HttpPost, ActionName("Delete")]

public ActionResult DeleteConfirmed(int id)

公共語言執行時 (CLR)過載方法時,需要方法具有獨特唯一的簽名 (方法名稱相同但不同的引數列表)。但是,在這裡您需要兩種刪除方法 — — 一個 GET方法和一個POST方法它們都具有相同的簽名。(他們都需要接受一個整數作為引數)。

要解決這一點,可以有幾種辦法。一是使用不同的方法名稱。這是框架程式碼在前面的示例中所使用的方法。然而,這就帶來了一個小問題: ASP.NET 將部分的 URL按名稱對映到操作方法,如果您重新命名了方法,通常Routing將無法找到該方法。解決方法是您在示例中看到的,將ActionName("Delete")屬性新增到DeleteConfirmed 方法。這會有效的執行Routing系統的Url對映,這樣一個包含/Delete/的 POST 請求的URL 將找到DeleteConfirmed 方法。

另一個常見的方法,來避免具有相同名稱和簽名的方法,是人為地改變POST 方法,包括未使用引數的簽名。例如,有些開發人員新增引數型別 FormCollectionFormCollection是會傳遞給 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 資料庫中儲存資料。您可以建立、 讀取、 更新、 刪除和搜尋電影。

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軟體開發討論區。請關注我們的部落格,這樣你就可以獲得最新教程的更新資訊流。

任何意見,歡迎反饋。

-----------------------------------------------------------------------------------------

《ASP.NET MVC 5 入門指南》12篇文章彙總如下:

1. ASP.NET MVC 5 - 開始MVC 5之旅

2. ASP.NET MVC 5 - 控制器

3. ASP.NET MVC 5 - 檢視

4. ASP.NET MVC 5 - 將資料從控制器傳遞給檢視

5. ASP.NET MVC 5 - 新增一個模型

6. ASP.NET MVC 5 - 建立連線字串(Connection String)並使用SQL Server LocalDB

7. ASP.NET MVC 5 - 從控制器訪問資料模型

8. ASP.NET MVC 5 - 驗證編輯方法(Edit method)和編輯檢視(Edit view)

9. ASP.NET MVC 5 - 給電影表和模型新增新欄位

10. ASP.NET MVC 5 - 給資料模型新增校驗器

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

12. ASP.NET MVC 5 - 使用Wijmo MVC 5模板1分鐘建立應用

 

希望這些文章對感興趣的朋友有所幫助,另附上PDF版的彙總文件:

ASP.NET MVC 5 入門指南》PDF版

 

相關閱讀:

微軟 Build 2017 開發者大會:Azure 與 AI 的快速發展

是什麼讓C#成為最值得學習的程式語言

從Visual Studio看微軟20年技術變遷

C#開發人員應該知道的13件事情

Visual Studio 2017正式版釋出全紀錄

 

相關文章