为什么jquery ajax请求在ZF2中返回404

时间:2014-08-10 16:45:15

标签: jquery ajax zend-framework2

我有一个Zend Framework 2表单,并尝试创建一个可靠的Dropdown。所以在选择Maincategory之后,我使用AJAX跳转到我的Controller加载子类别并通过JSON返回它们。我已经有了ZF1的解决方案,但是使用ZF2我不断发现错误404

我尝试在广告控制器中调用属于广告模型的操作loadsubcategory。对于我的所有页面,我都有路线。我真的很困惑,现在我的理解是我留在页面本身,所以在我看来我不需要AJAX请求的路由。我的网址目前为http://myproject.local/create/advert,此处为我的ajax电话:

$.ajax({
        url: '/advert/loadsubcategory/',
        data: { id: categoryID},

为什么我会得到404?

2 个答案:

答案 0 :(得分:1)

如果您未找到错误404 ,则控制器或您正在呼叫的操作不存在。

首先:看起来您在Ajax请求中使用的网址是错误的。 它应该是:

  url : '/advert/loadsubcategory',

而不是:

  url : '/advert/loadsubcategory/'

它不应该是网址末尾的/

第二:为了避免网址中出现任何错误,您可以在Zend视图中获得确切网址 文件,然后将其作为参数传递给dependentDropDown函数,如下所示:

<script type="text/javascript">
$(document).ready(function() {
var ajax_url = "<?= $this->url($this->route, array('controller'=>'advert', 'action'=>'loadsubcategory'));?>";
dependentDropDown(source_id, target_id, ajax_url);
});
</script>

假设您有dependentDropDown函数,如下所示:

dependentDropDown = function(source,target,url){            
    $('#'+source).change(function() {
            $.ajax({
                type:  'POST',
                async: true,
                url:   url,
                cache: true,
                dataType: 'json',
                data:  {id: $('#'+source).val() },
                success: function(data){
                    //success function, populating the target with data
                },
                error: function(jqXHR,textStatus,errorThrown){
                    var error = $.parseJSON(jqXHR.responseText);
                    var content = error.content;
                    console.log(content.message);
                    if(content.display_exceptions)
                        console.log(content.exception.xdebug_message);
                },

            });
    });
}

AdvertController

public function loadsubcategoryAction(){
    $request = $this->getRequest();
    if ($request->isPost())
    {
        $categoryID= $request->getPost('id', null);

        $data = new JsonModel(array(
                'success' => true,
                'results' =>$subcategories, //<---- your data to return
        ));
        return $data;
    }

}

希望这可以提供帮助。

答案 1 :(得分:0)

在搜索解决方案2天后,我发现我必须为AJAX请求创建路由。请参阅下面的更新路线。我不确定这是否是最佳解决方案,但似乎有效。

 'advertform' => array(
                    'type'    => 'Literal',
                    'options' => array(
                            'route'    => '/create/advert',
                            'defaults' => array(
                                    // Change this value to reflect the namespace in which
                                    // the controllers for your module are found
                                    '__NAMESPACE__' => 'Advert\Controller',
                                    'controller'    => 'Advert',
                                    'action'        => 'create',
                            ),
                    ),
                'may_terminate' => true,
                'child_routes' => array(
                    'profile' => array(
                        'type'    => 'Segment',
                        'options' => array(
                            'route'    => '/loadsubcategory[/:id]',
                            'defaults' => array(
                                'action' => 'loadsubcategory',
                            ),
                            'constraints' => array(
                                'id' => '[0-9]*'
                            ),
                        ),
                    ),
                ),              
        ),