首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >通过Ajax显示表单

通过Ajax显示表单
EN

Stack Overflow用户
提问于 2013-03-12 04:49:11
回答 2查看 2K关注 0票数 3

编辑

关于Ajax的许多问题都是关于通过ajax提交表单的(这一个非常流行),而不是关于如何通过ajax调用显示表单。

我的问题是关于粗体部分:用户请求表单-> ajaxCall -> displayForm ->用户提交表单->将表单发送给控制器->验证表单->发送给用户的响应(错误与否)。

问题是

ajax调用是POST,$request->isMethod('POST')在执行ajax调用时总是返回true。因此,如果通过ajax调用请求新表单,则将始终对其进行验证。随函附上下面的代码,表单显示为ok,但表单中显示了以下错误消息:

CSRF令牌无效。

问题是,在ajax调用请求控制器中的表单时,正在验证表单。

另外,提交表单效果良好,验证效果也很好。

有没有人知道如何通过Ajax显示表单,而不需要验证空白的新表单?

到目前为止我的代码是:

代码语言:javascript
运行
复制
/**
 * Display the message as well as the form to reply to that message
 *
 * @param Request $request
 * @return Response
 */
public function viewMessageAction(Request $request)
{
    //Forbid every request but jQuery's XHR
    if (!$request->isXmlHttpRequest()){
        return new Response('', 200, array('Content-Type' => 'application/json'));
    }

    //Retrieve the message from the request
    $messageId = $request->request->get('messageId');
    $message = $this->getMessageManager->getMessage($messageId);

    //Creates the form to reply to the message
    $form = $this->container->get('reply_form.factory')->create($message);

    if ($request->isMethod('POST')) {
        $form->bind($request);

        if ($form->isValid()) {
            //...
            return $this->redirect($this->generateUrl('task_success'));
        }
    }

    $answer =$this->container->get('templating')->renderResponse('AcmeMessageBundle:Message:message.html.twig', array(
        'form' => $form->createView(),
        'message' => $message
    ));

    $response = new Response();
    $response->headers->set('Content-type', 'application/json; charset=utf-8');
    $response->setContent(json_encode($answer));
    return $response;

}

编辑: jQuery部件:

代码语言:javascript
运行
复制
<script type="text/javascript">
    $(function(){

        var myPath = ;//...

        function getMessage(messageId){
            $.ajax({
                type: "POST",
                url:  myPath,
                data: "messageId="+messageId,
                success: function(returnData){
                    $('#message').html(returnData);
                }
            });
        }

    });
</script>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-12 05:02:57

ajax调用并不总是需要POST。它可以是获取、放置或删除。因此,当您进行ajax调用以获取表单时,请将其设置为get请求。

如果您正在使用jquery,下面是如何做到这一点的

代码语言:javascript
运行
复制
$.ajax({
   url: "http://localhost/proj/url",
   type:'GET'
})

如果使用的是XHR,则可以在open函数中指定类型。

代码语言:javascript
运行
复制
xhr.open( 'GET', URL)

PS:用JMS串行化服务代替json_encode来序列化是个好主意。

票数 2
EN

Stack Overflow用户

发布于 2013-03-12 12:54:01

您也可能会在FOSJsRoutingBundle中感到兴趣,因为它为ajax和Symfony2路由提供了很多便利。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15353539

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档