在不渲染视图的情况下调用cakephp 2控制器函数autoRender false无效

问题描述

每次加载页面时,我都试图提交一个隐藏的表单,为此我在控制器中创建了一个函数。我的问题是我不想离开当前视图,但是我不能重定向到我想停留的视图,因为那样会创建一个不断的页面加载循环,加载完成后调用我的函数,然后再次重定向。因此,我想在不重定向到上一个视图的情况下调用函数,但是也没有渲染新视图,为此我正在使用以下命令:

        $this->autoRender = false;
        $this->layout = false;
        $this->render(false);

尽管如此,这些行似乎对我不起作用,因为该动作一直被重定向到此函数,尝试呈现不存在的视图,而不是停留在前一个视图中。因此,我想知道是否还有另一种方法可以在控制器中调用一个函数,但仍停留在我所在的页面上(由于循环方面,因此不进行重定向)。如果有帮助,我将添加用于此操作的代码

这是我要保持呈现的视图的一部分,我具有与隐藏表单相关的功能

                    <?= $this->Form->create('Save data',array('url'=>'/exportations/save_data/'.$id,'enctype' => 'multipart/form-data','method' => 'post','id' => 'data'))?>

                    <input type="hidden" id="svgGraph" />
                    <div class="" id="cont"  style="display:none;"></div>

                    <?=$this->Form->end()?>

                </div>

            </div>  

        </div>

    </div>

</div>
<script>
$(document).ready(function(){
    
  var  chart =    Highcharts.chart( // code to create graph
    );
    var svg = chart.getSVG();
    $("#svg1").val(svg1);
       
});

$(document).ready(function () {
    document.getElementById('data').submit();
});

</script>

这是我当前的控制器'/ exportations / save_data /'函数

public function save_data(){

    $this->autoRender = false;
    $this->layout = false;
    $this->render(false);
    

    if($this->request->is('post')) {

        $data = $this->request->data;
        $exportation = $this->Exportation->save($data);
    }
    return;

}

当前,使用此代码成功存储了数据,但是由于控制器尝试呈现save_data视图,用户最终得到了一个空视图。

解决方法

如果只有 1 个(或几个)操作加载此表单,您可以在操作中处理。

在最初呈现表单的控制器操作中,检查帖子和数据,执行您需要的操作,然后完成其余操作并完成呈现视图。您不必在帖子中重定向。

这种保存成功的方式你可以设置一个请求数据参数,它可以反映在视图中,如果设置,JS不会“重新触发”表单。

@Greg Schmidt 在 UX 方面的 AJAX 想法是一个更好的解决方案,我会在任何一天选择它而不是我的建议。我只在你不想使用 AJAX 时才建议这个

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...