我正在开发一个评论框,通过JQuery AJAX调用来保存注释.
JQuery的
这是JQuery代码(这可以无缝地):
@H_403_6@$(".post-comment").click(function() { var $form = $(this).closest("form"); if($form) { $.ajax({ type: "POST",url: Routing.generate('discussion_create'),data: $form.serialize(),cache: false,success: function(html){ alert("Success!"); // Output something } }); } else { alert("An error occured"); } return false; });Symfony2控制器
Symfony2控制器方法然后拾取表单数据并处理它.作为该流程的一部分,它检查表单是否有效:
@H_403_6@$entry = new Discussion(); $discussionForm = $this->createForm(new DiscussionType(),$entry); if ($request->getMethod() == 'POST') { $discussionForm->bindRequest($request); if ($discussionForm->isValid()) {此检查未返回true.在else中我提取了哪些错误消息,并得到:
@H_403_6@Array ( [0] => The CSRF token is invalid. Please try to resubmit the form )CSRF令牌正在通过邮件传递,就像同时提交表单一样.
另一个可能的问题..唯一的表单ID
我使用的形式是由表单类型类创建的.在任何给定的页面上都会有几个注释表单.由于symfony2使用类型类的getName()方法来填充表单ID属性,所以我修改了它:
@H_403_6@public function getName() { return 'discussionForm' . $randomNumber; }这允许不具有相同id的多个注释表单.讨论框20,讨论框21,讨论框22等
解决方法
尝试使用足够的JQuery函数:submit()^^在我的解决方案中,我想你的表单有id“comment_form”.在我所有的sf2项目上工作:
@H_403_6@$('#comment_form').submit(function(e) {
var url = $(this).attr("action");
$.ajax({
type: "POST",url: url,// Or your url generator like Routing.generate('discussion_create')
data: $(this).serialize(),dataType: "html",success: function(msg){
alert("Success!");
}
});
return false;
});
通常会发送CSRF字段!