ASP.NET MVC jQuery刪除鏈接
在最近的一個(gè)帖子里,Stephen Walther指出了使用過一個(gè)超鏈接來刪除數(shù)據(jù)的危險(xiǎn)性。這篇文章對(duì)這方面問題進(jìn)行了很好的闡述。不過這類問題不僅僅局限于刪除操作。任何時(shí)候,你如果允許一個(gè)GET請(qǐng)求來修改數(shù)據(jù)的話,你就可能實(shí)在自找麻煩。這里有一個(gè)很久以前發(fā)生在BackPack身上的故事,你可以看一下就知道我的意思了。
之所以jQuery刪除操作值得我們格外注意是因?yàn)檫@是最常見的一個(gè)使用超鏈接修改信息的情況。如果你要修改一個(gè)產(chǎn)品記錄,那你可能會(huì)采用一個(gè)表格(form)。不過刪除操作通常只需要一個(gè)參數(shù)(就是要?jiǎng)h除記錄的id),而我們很容易在GET請(qǐng)求的URL中夾帶這個(gè)***的參數(shù)。
如果你在使用jQuery,一個(gè)很簡單的將任何超鏈接轉(zhuǎn)換成POST連接的方法是通過將以下代碼賦給onclick屬性值:
$.post(this.href); return false;
比如
- < a href="/go/delete/1" onclick="$.post(this.href); return false;">Delete< /a>
這段代碼會(huì)向/go/delete/1發(fā)送一個(gè)POST請(qǐng)求而不是一個(gè)GET請(qǐng)求。當(dāng)然,你也需要在服務(wù)器端做必要的規(guī)定,在asp.net mvc中,這很簡單:
- [AcceptVerbs(HttpVerbs.Post)]public ActionResult Delete(int id) { //Delete that stuff!}
AcceptVerbs屬性規(guī)定了這個(gè)action方法只響應(yīng)POST請(qǐng)求,而GET請(qǐng)求將被忽略。
至此,你應(yīng)該很容易編寫專門用于delete鏈接的幫助函數(shù)了。我通常會(huì)編寫很專用的幫助函數(shù),比如:Html.DeleteProduct或Html.DeleteQuestion. 這里有我正在編寫的一個(gè)示例程序中的一段jQuery刪除功能的代碼:
- public static string DeleteAnswerLink(this HtmlHelper html, string linkText , Answer answer) { return html.RouteLink(linkText, "answer", new { answerId = answer.Id, action = "delete" }, new { onclick="$.post(this.href); return false;" });}
這個(gè)方法的優(yōu)點(diǎn)在于你可以充分利用現(xiàn)存的幫助函數(shù)而只需通過onclick屬性來增加最少量的額外內(nèi)容來達(dá)到目的。
希望這個(gè)帖子以及Stephen的帖子能幫助你編寫更安全的jQuery刪除操作。
【編輯推薦】