MVC 5 - 查詢(xún)Details和Delete方法
在這部分教程中,接下來(lái)我們將討論自動(dòng)生成的Details和Delete方法。
查詢(xún)Details和Delete方法
打開(kāi)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引擎增加了一個(gè)注釋表明,在調(diào)用的HTTP請(qǐng)求方法中,GET請(qǐng)求有三個(gè)URL段,Movies控制器,Details方法和ID值。
Code First 使得您可以輕松的使用
Find
方法來(lái)搜索數(shù)據(jù)。一個(gè)重要的安全功能內(nèi)置到了方法中。方法首先驗(yàn)證
Find
方法已經(jīng)找到了一部電影,然后再執(zhí)行其它代碼。例如,黑客可以通過(guò)更改
http://localhost:xxxx/Movies/Details/1
到
http://localhost:xxxx/Movies/Details/12345
?(或某些其它值,不代表實(shí)際影片的值)從而使得鏈接URL 出現(xiàn)錯(cuò)誤。如果您沒(méi)有檢測(cè)是否找到了Movie, null Movie會(huì)導(dǎo)致出現(xiàn)數(shù)據(jù)錯(cuò)誤。
查看
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
"
);
}
請(qǐng)注意,
Delete
的
HTTP Get
?方法不會(huì)刪除指定的電影,它返回刪除電影的視圖,您可以在此視圖中提交 (
HttpPost
) 刪除電影。如果使用GET 請(qǐng)求執(zhí)行刪除操作(或者執(zhí)行編輯操作,創(chuàng)建操作或者更改數(shù)據(jù)的任何其它操作) 開(kāi)辟了一個(gè)安全漏洞。對(duì)此的詳細(xì)信息,請(qǐng)參閱斯蒂芬 · 瓦爾特的博客
ASP.NET MVC Tip #46 — Don't use Delete Links because they create Security Holes
.
將刪除數(shù)據(jù)的
HttpPost
方法命名為唯一簽名或名稱(chēng)的?
DeleteConfirmed
?方法。這兩個(gè)方法的簽名如下所示:
//
GET: /Movies/Delete/5
public
ActionResult Delete(
int
?
id)
//
//
POST: /Movies/Delete/5
[HttpPost, ActionName(
"
Delete
"
)]
public
ActionResult DeleteConfirmed(
int
id)
公共語(yǔ)言運(yùn)行時(shí) (CLR)重載方法時(shí),需要方法具有獨(dú)特唯一的簽名 (方法名稱(chēng)相同但不同的參數(shù)列表)。但是,在這里您需要兩種刪除方法 — — 一個(gè) GET方法和一個(gè)POST方法它們都具有相同的簽名。(他們都需要接受一個(gè)整數(shù)作為參數(shù))。
要解決這一點(diǎn),可以有幾種辦法。一是使用不同的方法名稱(chēng)。這是框架代碼在前面的示例中所使用的方法。然而,這就帶來(lái)了一個(gè)小問(wèn)題: ASP.NET 將部分的 URL按名稱(chēng)映射到操作方法,如果您重命名了方法,通常Routing將無(wú)法找到該方法。解決方法是您在示例中看到的,將
ActionName("Delete")
屬性添加到
DeleteConfirmed
?方法。這會(huì)有效的執(zhí)行Routing系統(tǒng)的Url映射,這樣一個(gè)包含
/Delete/
的 POST 請(qǐng)求的URL 將找到
DeleteConfirmed
?方法。
另一個(gè)常見(jiàn)的方法,來(lái)避免具有相同名稱(chēng)和簽名的方法,是人為地改變POST 方法,包括未使用參數(shù)的簽名。例如,有些開(kāi)發(fā)人員添加參數(shù)類(lèi)型? FormCollection , FormCollection 是會(huì)傳遞給 POST 方法的,然后根本不使用此參數(shù):
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
"
);
}
小結(jié)
您現(xiàn)在有一個(gè)完整的 ASP.NET MVC 應(yīng)用程序并在本地的 DB 數(shù)據(jù)庫(kù)中存儲(chǔ)數(shù)據(jù)。您可以創(chuàng)建、 讀取、 更新、 刪除和搜索電影。
下一步
在您構(gòu)建和測(cè)試一個(gè)Web應(yīng)用程序之后,下一步就是將其提供給其他人,以使得通過(guò)互聯(lián)網(wǎng)訪問(wèn)。要做到這一點(diǎn),你需要將它部署到一個(gè)Web主機(jī)。 如通過(guò)微軟的 free Windows Azure trial account ,您可以部署多達(dá)10個(gè)Web站點(diǎn)。我建議你??下一步請(qǐng)按照我的教程 Deploy a Secure ASP.NET MVC app with Membership, OAuth, and SQL Database to a Windows Azure Web Site ,以更深入了解如何部署。另外,還有一個(gè)很好的教程是Tom Dykstra's的中級(jí)的 Creating an Entity Framework Data Model for an ASP.NET MVC Application .? Stackoverflow ?和? ASP.NET MVC forums 。
提出問(wèn)題的好地方:StackOverflow的ASP.NET MVC的論壇或者 GCDN的Web軟件開(kāi)發(fā)討論區(qū) 。請(qǐng)關(guān)注 我們的博客 ,這樣你就可以獲得最新教程的更新信息流。
任何意見(jiàn),歡迎反饋。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元

