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