CakePHP-使用php变量加载视图并在ajax中返回

CakePHP-使用php变量加载视图并在ajax中返回,php,jquery,ajax,cakephp,Php,Jquery,Ajax,Cakephp,好吧,这几天我都快疯了 我有一张表格: echo $this->Form->create(FALSE, array('id' => 'AdminGeneralReport', 'class' => 'ReportForm')); echo '<div class="row">'; echo $this->Form->input('ReportCenter', array(

好吧,这几天我都快疯了

我有一张表格:

echo $this->Form->create(FALSE, array('id' => 'AdminGeneralReport', 'class' => 'ReportForm'));
                echo '<div class="row">';
                echo $this->Form->input('ReportCenter', array(
                    'type'=>'select', 'div' => 'form-group', 
                    'options' => $centers,
                    'label' => 'المركز', 
                    'class' => 'form-control report-center',
                    'selected' => isset($selections['CenterID'])? $selections['CenterID']['value'] : 'default'
                    ));

                echo $this->Form->input('ReportYears', array(
                    'type'=>'select', 'div' => 'form-group', 
                    'options' => $years,
                    'label' => 'العام الدراسي', 
                    'class' => 'form-control report-year',
                    'selected' => isset($selections['YearID'])? $selections['YearID']['value'] : 'default'
                    ));
echo $this->Form->end();                    
$('.ReportForm').off('submit').on('submit', function(e){
    e.preventDefault();
    var formID = $(this).attr('id');
    var data = JSON.stringify($(this).serializeObject());
    var url = base_url + "Reports/" + formID;
    var targetSelector = $(this).attr('data-target') || '.results-row';     
    var $target = $(targetSelector);

    // Show app loading
    $('#AppLoading').show();

    $.ajax({
        url         : url,
        type        : 'POST',
        ContentType : 'application/json',
        data        : {'data': data}
    }).done(function(response){
        try{        
            response = JSON.parse($response);
            if(response.status == 'success'){
                $target.html(response.html);
            }               
            else{
                $('#AppWell').show('slow').children('p').html(response.msg);
            }
        } 
        catch (ex) {
            var msg = 'عذراً، حدث خطأ في إنشاء التقرير. برجاء المحاولة لاحقاً';
            $('#AppWell').show('slow').children('p').html(msg);
            console.log('Exception :: ' + ex.toString());
            console.log('Response :: ' + response);
        }
    }).fail(function(request, status, error){
        var msg = 'عذراً، حدث خطأ في إنشاء التقرير. برجاء المحاولة لاحقاً';
        $('#AppWell').show('slow').children('p').html(msg);
        console.log('XXXXX Ajax Failure :: ' + error);
    }).always(function(){
        // Hide app loading
        $('#AppLoading').hide();
    }); 
});
<?php if(isset($selections['Filtered']) && $selections['Filtered'] == TRUE ){
echo '<div class="row">';
$Report = '';   
if(isset($selections['SexID']) && $selections['SexID']['value'] != 'default'){
    $Report .= '<div class="report-info">
                    <p class="title">الجنس</p>
                    <p class="value">'.$selections['SexID']['text'].'</p>
                </div>';                    
}
if(isset($selections['GovID']) && $selections['GovID']['value'] != 'default'){
    $Report .= '<div class="report-info">
                    <p class="title">المحافظة</p>
                    <p class="value">'.$selections['GovID']['text'].'</p>
                </div>';                    
}   

echo '</div>';
?>
<div class="cur-report custom-inverse">
    <?=$Report;?>
</div>
// This is the function the ajax calls
public function AdminGeneralReport()
{
    // Enable automatic view class switching on content types
    public $components = array('RequestHandler');

    // Disable auto rendering
    $this->autoRender = false;          
    // Create new view to return to ajax request
    $view = new View($this, false);

    // Define selections array
    $selections = array();

    // Get AJAX data
    $postData = $this->request->data;
    // Decode post data to JSON object
    $data = json_decode($postData);

    // Create response object
    $response = new stdClass();
    $response->status = 'fail';     // Should be changed by success scenario

    // ********* Center Condition ********* //
    $centerCond = '';
    // Check if Center is set
    if($data->ReportCenter != 'default'){
        $centerID = $data->ReportCenter;
        $selections['CenterID']['value'] = $centerID;
        $selections['CenterID']['text'] = $centers[$centerID];
        $selections['Filtered'] = TRUE;

        $centerCond = array('CenterID' => $centerID);
    }
    // *********************************************** //

    // ********* Year Condition ********* //
    $yearCond = '';
    // Check if Academic Year is set
    if($data->ReportYears != 'default'){
        $yearID = $data->ReportYears;
        $selections['YearID']['value'] = $yearID;
        $selections['YearID']['text'] = $years[$yearID];
        $selections['Filtered'] = TRUE;

        $yearCond = array('YearID' => $yearID);

        $allTerms = $this->Term->find('all', array('conditions' => array('YearID' => $yearID), 
            'fields' => array('ID', 'TermName')));
        // Convert results from 3D array to 1D array
        for($i = 0; $i < count($allTerms); $i++){
            $terms[$allTerms[$i]['Term']['ID']] = $allTerms[$i]['Term']['TermName'];
        }
        $terms['default'] = 'الكل';
    }
    // *********************************************** //

    if($selections){                                                                
        $response->status = 'success';
    }
    else{
        $response->msg = 'لا توجد بيانات لهذه الإختيارات';
    }           

    $view->set(compact('results','selections'));        
    $view->set('_serialize', array('results', 'selections'));
    $html = $view->render('Admin/General', FALSE);
    $response->html = $html;

    echo json_encode($response);
    die();
}
$results = array();     // Fill it
$selections = array();    // Fill it
...
// Disable auto rendering
$this->autoRender = false;          
// Create new view to return to ajax request
$view = new View($this, false);
$view->set(compact('results','selections'));            
$view->set('_serialize', array('results', 'selections'));

$html = stripcslashes( stripslashes( $view->render('Admin/General', FALSE) ) );
$response->html = $html;

echo json_encode($response);
die();
$.ajax({
    url         : url,
    type        : 'POST',
    ContentType : 'application/json',
    data        : {'data': data}
}).done(function(response){
    try{        
        response = JSON.parse(response);
        if(response.status == 'success'){
            $target.html(response.html);
        }               
        else{
            // ERROR HANDLING
        }
    } 
    catch (ex) {
        // ERROR HANDLING
        console.log('Exception :: ' + ex.toString());
        console.log('Response :: ' + response);
    }
}).fail(function(request, status, error){
    // ERROR HANDLING
    console.log('XXXXX Ajax Failure :: ' + error);
}).always(function(){
    // Hide loading     
}); 

问题/需要:我想加载另一个视图,并使用json或任何可能的方式将其附加到此表单之后


这是我要加载的视图的一部分:

echo $this->Form->create(FALSE, array('id' => 'AdminGeneralReport', 'class' => 'ReportForm'));
                echo '<div class="row">';
                echo $this->Form->input('ReportCenter', array(
                    'type'=>'select', 'div' => 'form-group', 
                    'options' => $centers,
                    'label' => 'المركز', 
                    'class' => 'form-control report-center',
                    'selected' => isset($selections['CenterID'])? $selections['CenterID']['value'] : 'default'
                    ));

                echo $this->Form->input('ReportYears', array(
                    'type'=>'select', 'div' => 'form-group', 
                    'options' => $years,
                    'label' => 'العام الدراسي', 
                    'class' => 'form-control report-year',
                    'selected' => isset($selections['YearID'])? $selections['YearID']['value'] : 'default'
                    ));
echo $this->Form->end();                    
$('.ReportForm').off('submit').on('submit', function(e){
    e.preventDefault();
    var formID = $(this).attr('id');
    var data = JSON.stringify($(this).serializeObject());
    var url = base_url + "Reports/" + formID;
    var targetSelector = $(this).attr('data-target') || '.results-row';     
    var $target = $(targetSelector);

    // Show app loading
    $('#AppLoading').show();

    $.ajax({
        url         : url,
        type        : 'POST',
        ContentType : 'application/json',
        data        : {'data': data}
    }).done(function(response){
        try{        
            response = JSON.parse($response);
            if(response.status == 'success'){
                $target.html(response.html);
            }               
            else{
                $('#AppWell').show('slow').children('p').html(response.msg);
            }
        } 
        catch (ex) {
            var msg = 'عذراً، حدث خطأ في إنشاء التقرير. برجاء المحاولة لاحقاً';
            $('#AppWell').show('slow').children('p').html(msg);
            console.log('Exception :: ' + ex.toString());
            console.log('Response :: ' + response);
        }
    }).fail(function(request, status, error){
        var msg = 'عذراً، حدث خطأ في إنشاء التقرير. برجاء المحاولة لاحقاً';
        $('#AppWell').show('slow').children('p').html(msg);
        console.log('XXXXX Ajax Failure :: ' + error);
    }).always(function(){
        // Hide app loading
        $('#AppLoading').hide();
    }); 
});
<?php if(isset($selections['Filtered']) && $selections['Filtered'] == TRUE ){
echo '<div class="row">';
$Report = '';   
if(isset($selections['SexID']) && $selections['SexID']['value'] != 'default'){
    $Report .= '<div class="report-info">
                    <p class="title">الجنس</p>
                    <p class="value">'.$selections['SexID']['text'].'</p>
                </div>';                    
}
if(isset($selections['GovID']) && $selections['GovID']['value'] != 'default'){
    $Report .= '<div class="report-info">
                    <p class="title">المحافظة</p>
                    <p class="value">'.$selections['GovID']['text'].'</p>
                </div>';                    
}   

echo '</div>';
?>
<div class="cur-report custom-inverse">
    <?=$Report;?>
</div>
// This is the function the ajax calls
public function AdminGeneralReport()
{
    // Enable automatic view class switching on content types
    public $components = array('RequestHandler');

    // Disable auto rendering
    $this->autoRender = false;          
    // Create new view to return to ajax request
    $view = new View($this, false);

    // Define selections array
    $selections = array();

    // Get AJAX data
    $postData = $this->request->data;
    // Decode post data to JSON object
    $data = json_decode($postData);

    // Create response object
    $response = new stdClass();
    $response->status = 'fail';     // Should be changed by success scenario

    // ********* Center Condition ********* //
    $centerCond = '';
    // Check if Center is set
    if($data->ReportCenter != 'default'){
        $centerID = $data->ReportCenter;
        $selections['CenterID']['value'] = $centerID;
        $selections['CenterID']['text'] = $centers[$centerID];
        $selections['Filtered'] = TRUE;

        $centerCond = array('CenterID' => $centerID);
    }
    // *********************************************** //

    // ********* Year Condition ********* //
    $yearCond = '';
    // Check if Academic Year is set
    if($data->ReportYears != 'default'){
        $yearID = $data->ReportYears;
        $selections['YearID']['value'] = $yearID;
        $selections['YearID']['text'] = $years[$yearID];
        $selections['Filtered'] = TRUE;

        $yearCond = array('YearID' => $yearID);

        $allTerms = $this->Term->find('all', array('conditions' => array('YearID' => $yearID), 
            'fields' => array('ID', 'TermName')));
        // Convert results from 3D array to 1D array
        for($i = 0; $i < count($allTerms); $i++){
            $terms[$allTerms[$i]['Term']['ID']] = $allTerms[$i]['Term']['TermName'];
        }
        $terms['default'] = 'الكل';
    }
    // *********************************************** //

    if($selections){                                                                
        $response->status = 'success';
    }
    else{
        $response->msg = 'لا توجد بيانات لهذه الإختيارات';
    }           

    $view->set(compact('results','selections'));        
    $view->set('_serialize', array('results', 'selections'));
    $html = $view->render('Admin/General', FALSE);
    $response->html = $html;

    echo json_encode($response);
    die();
}
$results = array();     // Fill it
$selections = array();    // Fill it
...
// Disable auto rendering
$this->autoRender = false;          
// Create new view to return to ajax request
$view = new View($this, false);
$view->set(compact('results','selections'));            
$view->set('_serialize', array('results', 'selections'));

$html = stripcslashes( stripslashes( $view->render('Admin/General', FALSE) ) );
$response->html = $html;

echo json_encode($response);
die();
$.ajax({
    url         : url,
    type        : 'POST',
    ContentType : 'application/json',
    data        : {'data': data}
}).done(function(response){
    try{        
        response = JSON.parse(response);
        if(response.status == 'success'){
            $target.html(response.html);
        }               
        else{
            // ERROR HANDLING
        }
    } 
    catch (ex) {
        // ERROR HANDLING
        console.log('Exception :: ' + ex.toString());
        console.log('Response :: ' + response);
    }
}).fail(function(request, status, error){
    // ERROR HANDLING
    console.log('XXXXX Ajax Failure :: ' + error);
}).always(function(){
    // Hide loading     
}); 

终于解决了

我试图把它变成一个数据视图json/xml,这让我感到困惑。。。虽然我需要做的只是格式化返回的视图:

返回的视图有很多“\r\n\”…所有在jQuery代码中无法进行JSON分析的转义序列

我不必包括
Router::parseExtensions('json');
以及
public$components=array('RequestHandler');


这是PHP代码:

echo $this->Form->create(FALSE, array('id' => 'AdminGeneralReport', 'class' => 'ReportForm'));
                echo '<div class="row">';
                echo $this->Form->input('ReportCenter', array(
                    'type'=>'select', 'div' => 'form-group', 
                    'options' => $centers,
                    'label' => 'المركز', 
                    'class' => 'form-control report-center',
                    'selected' => isset($selections['CenterID'])? $selections['CenterID']['value'] : 'default'
                    ));

                echo $this->Form->input('ReportYears', array(
                    'type'=>'select', 'div' => 'form-group', 
                    'options' => $years,
                    'label' => 'العام الدراسي', 
                    'class' => 'form-control report-year',
                    'selected' => isset($selections['YearID'])? $selections['YearID']['value'] : 'default'
                    ));
echo $this->Form->end();                    
$('.ReportForm').off('submit').on('submit', function(e){
    e.preventDefault();
    var formID = $(this).attr('id');
    var data = JSON.stringify($(this).serializeObject());
    var url = base_url + "Reports/" + formID;
    var targetSelector = $(this).attr('data-target') || '.results-row';     
    var $target = $(targetSelector);

    // Show app loading
    $('#AppLoading').show();

    $.ajax({
        url         : url,
        type        : 'POST',
        ContentType : 'application/json',
        data        : {'data': data}
    }).done(function(response){
        try{        
            response = JSON.parse($response);
            if(response.status == 'success'){
                $target.html(response.html);
            }               
            else{
                $('#AppWell').show('slow').children('p').html(response.msg);
            }
        } 
        catch (ex) {
            var msg = 'عذراً، حدث خطأ في إنشاء التقرير. برجاء المحاولة لاحقاً';
            $('#AppWell').show('slow').children('p').html(msg);
            console.log('Exception :: ' + ex.toString());
            console.log('Response :: ' + response);
        }
    }).fail(function(request, status, error){
        var msg = 'عذراً، حدث خطأ في إنشاء التقرير. برجاء المحاولة لاحقاً';
        $('#AppWell').show('slow').children('p').html(msg);
        console.log('XXXXX Ajax Failure :: ' + error);
    }).always(function(){
        // Hide app loading
        $('#AppLoading').hide();
    }); 
});
<?php if(isset($selections['Filtered']) && $selections['Filtered'] == TRUE ){
echo '<div class="row">';
$Report = '';   
if(isset($selections['SexID']) && $selections['SexID']['value'] != 'default'){
    $Report .= '<div class="report-info">
                    <p class="title">الجنس</p>
                    <p class="value">'.$selections['SexID']['text'].'</p>
                </div>';                    
}
if(isset($selections['GovID']) && $selections['GovID']['value'] != 'default'){
    $Report .= '<div class="report-info">
                    <p class="title">المحافظة</p>
                    <p class="value">'.$selections['GovID']['text'].'</p>
                </div>';                    
}   

echo '</div>';
?>
<div class="cur-report custom-inverse">
    <?=$Report;?>
</div>
// This is the function the ajax calls
public function AdminGeneralReport()
{
    // Enable automatic view class switching on content types
    public $components = array('RequestHandler');

    // Disable auto rendering
    $this->autoRender = false;          
    // Create new view to return to ajax request
    $view = new View($this, false);

    // Define selections array
    $selections = array();

    // Get AJAX data
    $postData = $this->request->data;
    // Decode post data to JSON object
    $data = json_decode($postData);

    // Create response object
    $response = new stdClass();
    $response->status = 'fail';     // Should be changed by success scenario

    // ********* Center Condition ********* //
    $centerCond = '';
    // Check if Center is set
    if($data->ReportCenter != 'default'){
        $centerID = $data->ReportCenter;
        $selections['CenterID']['value'] = $centerID;
        $selections['CenterID']['text'] = $centers[$centerID];
        $selections['Filtered'] = TRUE;

        $centerCond = array('CenterID' => $centerID);
    }
    // *********************************************** //

    // ********* Year Condition ********* //
    $yearCond = '';
    // Check if Academic Year is set
    if($data->ReportYears != 'default'){
        $yearID = $data->ReportYears;
        $selections['YearID']['value'] = $yearID;
        $selections['YearID']['text'] = $years[$yearID];
        $selections['Filtered'] = TRUE;

        $yearCond = array('YearID' => $yearID);

        $allTerms = $this->Term->find('all', array('conditions' => array('YearID' => $yearID), 
            'fields' => array('ID', 'TermName')));
        // Convert results from 3D array to 1D array
        for($i = 0; $i < count($allTerms); $i++){
            $terms[$allTerms[$i]['Term']['ID']] = $allTerms[$i]['Term']['TermName'];
        }
        $terms['default'] = 'الكل';
    }
    // *********************************************** //

    if($selections){                                                                
        $response->status = 'success';
    }
    else{
        $response->msg = 'لا توجد بيانات لهذه الإختيارات';
    }           

    $view->set(compact('results','selections'));        
    $view->set('_serialize', array('results', 'selections'));
    $html = $view->render('Admin/General', FALSE);
    $response->html = $html;

    echo json_encode($response);
    die();
}
$results = array();     // Fill it
$selections = array();    // Fill it
...
// Disable auto rendering
$this->autoRender = false;          
// Create new view to return to ajax request
$view = new View($this, false);
$view->set(compact('results','selections'));            
$view->set('_serialize', array('results', 'selections'));

$html = stripcslashes( stripslashes( $view->render('Admin/General', FALSE) ) );
$response->html = $html;

echo json_encode($response);
die();
$.ajax({
    url         : url,
    type        : 'POST',
    ContentType : 'application/json',
    data        : {'data': data}
}).done(function(response){
    try{        
        response = JSON.parse(response);
        if(response.status == 'success'){
            $target.html(response.html);
        }               
        else{
            // ERROR HANDLING
        }
    } 
    catch (ex) {
        // ERROR HANDLING
        console.log('Exception :: ' + ex.toString());
        console.log('Response :: ' + response);
    }
}).fail(function(request, status, error){
    // ERROR HANDLING
    console.log('XXXXX Ajax Failure :: ' + error);
}).always(function(){
    // Hide loading     
}); 
注意:
stripcslashes()
删除“\r\n”转义序列,而
stripcslashes
将删除“\'\”转义序列


jQuery代码:

echo $this->Form->create(FALSE, array('id' => 'AdminGeneralReport', 'class' => 'ReportForm'));
                echo '<div class="row">';
                echo $this->Form->input('ReportCenter', array(
                    'type'=>'select', 'div' => 'form-group', 
                    'options' => $centers,
                    'label' => 'المركز', 
                    'class' => 'form-control report-center',
                    'selected' => isset($selections['CenterID'])? $selections['CenterID']['value'] : 'default'
                    ));

                echo $this->Form->input('ReportYears', array(
                    'type'=>'select', 'div' => 'form-group', 
                    'options' => $years,
                    'label' => 'العام الدراسي', 
                    'class' => 'form-control report-year',
                    'selected' => isset($selections['YearID'])? $selections['YearID']['value'] : 'default'
                    ));
echo $this->Form->end();                    
$('.ReportForm').off('submit').on('submit', function(e){
    e.preventDefault();
    var formID = $(this).attr('id');
    var data = JSON.stringify($(this).serializeObject());
    var url = base_url + "Reports/" + formID;
    var targetSelector = $(this).attr('data-target') || '.results-row';     
    var $target = $(targetSelector);

    // Show app loading
    $('#AppLoading').show();

    $.ajax({
        url         : url,
        type        : 'POST',
        ContentType : 'application/json',
        data        : {'data': data}
    }).done(function(response){
        try{        
            response = JSON.parse($response);
            if(response.status == 'success'){
                $target.html(response.html);
            }               
            else{
                $('#AppWell').show('slow').children('p').html(response.msg);
            }
        } 
        catch (ex) {
            var msg = 'عذراً، حدث خطأ في إنشاء التقرير. برجاء المحاولة لاحقاً';
            $('#AppWell').show('slow').children('p').html(msg);
            console.log('Exception :: ' + ex.toString());
            console.log('Response :: ' + response);
        }
    }).fail(function(request, status, error){
        var msg = 'عذراً، حدث خطأ في إنشاء التقرير. برجاء المحاولة لاحقاً';
        $('#AppWell').show('slow').children('p').html(msg);
        console.log('XXXXX Ajax Failure :: ' + error);
    }).always(function(){
        // Hide app loading
        $('#AppLoading').hide();
    }); 
});
<?php if(isset($selections['Filtered']) && $selections['Filtered'] == TRUE ){
echo '<div class="row">';
$Report = '';   
if(isset($selections['SexID']) && $selections['SexID']['value'] != 'default'){
    $Report .= '<div class="report-info">
                    <p class="title">الجنس</p>
                    <p class="value">'.$selections['SexID']['text'].'</p>
                </div>';                    
}
if(isset($selections['GovID']) && $selections['GovID']['value'] != 'default'){
    $Report .= '<div class="report-info">
                    <p class="title">المحافظة</p>
                    <p class="value">'.$selections['GovID']['text'].'</p>
                </div>';                    
}   

echo '</div>';
?>
<div class="cur-report custom-inverse">
    <?=$Report;?>
</div>
// This is the function the ajax calls
public function AdminGeneralReport()
{
    // Enable automatic view class switching on content types
    public $components = array('RequestHandler');

    // Disable auto rendering
    $this->autoRender = false;          
    // Create new view to return to ajax request
    $view = new View($this, false);

    // Define selections array
    $selections = array();

    // Get AJAX data
    $postData = $this->request->data;
    // Decode post data to JSON object
    $data = json_decode($postData);

    // Create response object
    $response = new stdClass();
    $response->status = 'fail';     // Should be changed by success scenario

    // ********* Center Condition ********* //
    $centerCond = '';
    // Check if Center is set
    if($data->ReportCenter != 'default'){
        $centerID = $data->ReportCenter;
        $selections['CenterID']['value'] = $centerID;
        $selections['CenterID']['text'] = $centers[$centerID];
        $selections['Filtered'] = TRUE;

        $centerCond = array('CenterID' => $centerID);
    }
    // *********************************************** //

    // ********* Year Condition ********* //
    $yearCond = '';
    // Check if Academic Year is set
    if($data->ReportYears != 'default'){
        $yearID = $data->ReportYears;
        $selections['YearID']['value'] = $yearID;
        $selections['YearID']['text'] = $years[$yearID];
        $selections['Filtered'] = TRUE;

        $yearCond = array('YearID' => $yearID);

        $allTerms = $this->Term->find('all', array('conditions' => array('YearID' => $yearID), 
            'fields' => array('ID', 'TermName')));
        // Convert results from 3D array to 1D array
        for($i = 0; $i < count($allTerms); $i++){
            $terms[$allTerms[$i]['Term']['ID']] = $allTerms[$i]['Term']['TermName'];
        }
        $terms['default'] = 'الكل';
    }
    // *********************************************** //

    if($selections){                                                                
        $response->status = 'success';
    }
    else{
        $response->msg = 'لا توجد بيانات لهذه الإختيارات';
    }           

    $view->set(compact('results','selections'));        
    $view->set('_serialize', array('results', 'selections'));
    $html = $view->render('Admin/General', FALSE);
    $response->html = $html;

    echo json_encode($response);
    die();
}
$results = array();     // Fill it
$selections = array();    // Fill it
...
// Disable auto rendering
$this->autoRender = false;          
// Create new view to return to ajax request
$view = new View($this, false);
$view->set(compact('results','selections'));            
$view->set('_serialize', array('results', 'selections'));

$html = stripcslashes( stripslashes( $view->render('Admin/General', FALSE) ) );
$response->html = $html;

echo json_encode($response);
die();
$.ajax({
    url         : url,
    type        : 'POST',
    ContentType : 'application/json',
    data        : {'data': data}
}).done(function(response){
    try{        
        response = JSON.parse(response);
        if(response.status == 'success'){
            $target.html(response.html);
        }               
        else{
            // ERROR HANDLING
        }
    } 
    catch (ex) {
        // ERROR HANDLING
        console.log('Exception :: ' + ex.toString());
        console.log('Response :: ' + response);
    }
}).fail(function(request, status, error){
    // ERROR HANDLING
    console.log('XXXXX Ajax Failure :: ' + error);
}).always(function(){
    // Hide loading     
}); 

你为什么要用JSON呢?您想要发送表单数据,并且想要接收HTML,这里根本不需要JSON。只需使用一个普通的AJAX请求,该请求发送序列化(非对象序列化)表单数据,并期望HTML作为响应,那么您不需要任何黑客攻击,只需包含请求处理程序组件,以便它相应地选择AJAX布局。好的,cake将模型名称附加到控件名称,因此serialize为我服务,其次,正如我在回答中所说的那样,我对此感到困惑……这并没有真正回答我的任何“问题”,这些问题大多是修辞性的:)