【问题标题】:Display form via Ajax通过 Ajax 显示表单
【发布时间】:2013-02-27 12:17:37
【问题描述】:

编辑

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

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


问题

ajax 调用是一个 POST,$request->isMethod('POST') 在进行 ajax 调用时总是返回 true。因此,如果通过 ajax 调用请求新表单,它将始终被验证。我附上了下面的代码,表单显示正常,但是表单中显示如下错误信息:

CSRF 令牌无效。

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

附带说明,提交表单效果很好,验证效果很好。

有谁知道如何通过 Ajax 显示表单而不验证空白的新表单?

到目前为止我的代码:

/**
 * 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 部分:

<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>

【问题讨论】:

    标签: ajax symfony


    【解决方案1】:

    ajax 调用并不总是需要 POST。它可以是 GET、PUT 或 DELETE。因此,当您进行 ajax 调用以获取表单时,请使其成为 GET 请求。

    如果你在这里使用 jquery,你就是这样做的

    $.ajax({
       url: "http://localhost/proj/url",
       type:'GET'
    })
    

    如果你使用的是Using XHR,可以​​在open函数中指定类型

    xhr.open( 'GET', URL)
    

    PS:最好使用JMS Serializer Service 进行序列化而不是json_encode

    【讨论】:

    • 非常感谢@Sethunath,我已经用我的 jQuery 代码更新了我的问题。不幸的是,我使用 POST 方法从控制器询问我需要哪种表单。
    • 如果你需要使用 POST ,你也需要传递一些参数来区分表单提交。如果你可以让它 GET ,它应该可以马上工作
    • 听起来很聪明!所以我可以传递一个像isFormRequest 这样的参数,如果这是真的我不执行验证?我说的对吗?
    • 没错。但如果你能发出请求 GET 总是更好
    • 我明白了......但我肯定需要向控制器发送查询......否则我没有得到正确的表格:)
    【解决方案2】:

    您可能还对FOSJsRoutingBundle 感兴趣,因为它为使用 ajax 和 Symfony2 路由增加了很多舒适度。

    【讨论】:

    • 谢谢@byf-ferdy。我已经在使用 FOSJsRoutingBundle,这是一个非常好的推荐。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-20
    • 1970-01-01
    • 1970-01-01
    • 2015-04-22
    • 1970-01-01
    • 1970-01-01
    • 2019-10-27
    相关资源
    最近更新 更多