在最近的一个帖子里,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删除操作。
【编辑推荐】