Как выполнить проверку на стороне сервера с помощью Jqgrid?

Я использую jqgrid для отображения списка сайтов и хочу выполнить некоторую проверку на стороне сервера при добавлении или редактировании сайта. (Редактирование формы, а не встроенное. Проверка должна выполняться на стороне сервера по разным причинам, которые я не буду вдаваться в подробности.)

Я подумал, что лучше всего будет проверить данные с помощью запроса ajax, когда запускается событие beforeSubmit. Однако это работает только тогда, когда я редактирую существующую строку в сетке - функция не вызывается, когда я добавляю новую строку.

Я получил свой beforeSubmit не в том месте?

Спасибо за вашу помощь.

    $("#sites-grid").jqGrid({
        url:'/json/sites',
        datatype: "json",
        mtype: 'GET',         
        colNames:['Code', 'Name', 'Area', 'Cluster', 'Date Live', 'Status', 'Lat', 'Lng'],
        colModel :[ 
          {name:'code', index:'code', width:80, align:'left', editable:true}, 
          {name:'name', index:'name', width:250, align:'left', editrules:{required:true}, editable:true}, 
          {name:'area', index:'area', width:60, align:'left', editable:true}, 
          {name:'cluster_id', index:'cluster_id', width:80, align:'right', editrules:{required:true, integer:true}, editable:true, edittype:"select", editoptions:{value:"<?php echo $cluster_options; ?>"}}, 
          {name:'estimated_live_date', index:'estimated_live_date', width:120, align:'left', editable:true, editrules:{required:true}, edittype:"select", editoptions:{value:"<?php echo $this->month_options; ?>"}}, 
          {name:'status', index:'status', width:80, align:'left', editable:true, edittype:"select", editoptions:{value:"Live:Live;Plan:Plan;"}}, 
          {name:'lat', index:'lat', width:140, align:'right', editrules:{required:true}, editable:true}, 
          {name:'lng', index:'lng', width:140, align:'right', editrules:{required:true}, editable:true}, 
        ],
        height: '300',
        pager: '#pager-sites',
        rowNum:30,
        rowList:[10,30,90],
        sortname: 'cluster_id',
        sortorder: 'desc',
        viewrecords: true,
        multiselect: false,
        caption: 'Sites',
        editurl: '/json/sites'
     });

    $("#sites-grid").jqGrid('navGrid','#pager-sites',{edit:true,add:true,del:true, beforeSubmit : function(postdata, formid) { 
        $.ajax({
            url      : 'json/validate-site/', 
            data     : postdata,
            dataType : 'json',
            type     : 'post',
            success  : function(data) { 
                alert(data.message);
                return[data.result, data.message];
            }
        });
    }});

person Eoghan    schedule 17.06.2010    source источник
comment
Нет смысла использовать beforeSubmit, который, очевидно, срабатывает до передачи данных на сервер. И вы делаете отдельную отправку в beforeSubmit только для проверки. URL-адрес (и код), к которому привязано редактирование / добавление вашего сайта, должен просто обрабатывать как проверку, так и сохранение данных. А в afterSubmit вы проверите ответ, который может быть успешным сохранением или ошибкой проверки.   -  person Botond Béres    schedule 17.06.2010


Ответы (1)


Если вы хотите использовать событие beforeSubmit, вам следует использовать его в другом месте (см. http://www.trirand.com/jqgridwiki/doku.php?id=wiki:navigator):

$("#sites-grid").jqGrid('navGrid','#pager-sites',{/**/},
    {beforeSubmit : function(postdata, formid) { /**/ }} // edit parameters
    );

Я придерживаюсь того же мнения, что и Botondus (см. Комментарий), что вы пытаетесь использовать beforeSubmit неправильно. Сервер, получивший запрос на редактирование данных (запрос на сохранение измененных данных), не должен его сохранять. Это может, конечно, проверить данные и ответить с ошибкой HTTP вместо 200 OK. Для декодирования ответа об ошибке и подготовки сообщения об ошибке можно использовать событие errorTextFormat (см. http://www.trirand.com/jqgridwiki/doku.php?id=wiki:form_editing#events).

person Oleg    schedule 17.06.2010
comment
Спасибо за ввод, ребята - имеет больше смысла выполнять проверку / сохранение в той же операции. Но у меня все еще та же проблема: события beforeSubmit и afterSubmit срабатывают только при редактировании существующей строки. Как я могу проверить, когда я добавляю новую строку? Есть какая-то функция afterAdd? Не могу найти его в документации. - person Eoghan; 21.06.2010
comment
Если вы хотите использовать проверку на стороне сервера, данные, заполненные пользователем, будут отправлены на сервер, и сервер может либо сохранить их и отправить обратно идентификатор новой строки данных, либо отправить обратно HTTP-ошибку с описанием ошибки, которое вы отображаете на Пользователь. Если вы хотите выполнить проверку на стороне клиента, вы можете сделать это внутри beforeSubmit для добавления так же, как и для редактирования. Функция navGrid имеет полную форму jQuery("#grid_id").jqGrid('navGrid','#gridpager',{parameters},prmEdit, prmAdd, prmDel, prmSearch, prmView);, где prmAdd имеет ту же форму, что и prmEdit, который я описал в своем ответе. - person Oleg; 21.06.2010