2010-06-17 9 views
0

Я использую 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]; 
      } 
     }); 
    }}); 
+1

Не имеет смысла использовать beforeSubmit, что, очевидно, срабатывает * перед тем, как данные передаются на сервер. И вы делаете отдельный submit в beforeSubmit только для проверки. URL-адрес (и код), к которому привязан ваш сайт/добавление, должен просто обрабатывать и валидацию + сохранение данных. И в afterSubmit вы проверите ответ, который может быть успешно сохранен или ошибка проверки. –

ответ

0

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

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

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

+0

Благодарим за входных парней - у него есть смысл делать валидацию/сохранение в той же операции. Но у меня все еще такая же проблема: события beforeSubmit и afterSubmit запускаются только при редактировании существующей строки. Как я могу подтвердить, когда добавляю новую строку? Есть ли какая-то функция «afterAdd»? Кажется, он не найден в документации. – Eoghan

+0

Если вы хотите использовать проверку на стороне сервера, данные, заполненные пользователем, будут отправляться на сервер, и сервер может либо сохранить его, либо отправить обратно идентификатор новой строки данных или отправить HTTP-сообщение об ошибке с описанием ошибки, которое вы показываете для пользователя. Если вы хотите сделать проверку на стороне клиента, вы можете сделать это внутри 'beforeSubmit' для Add так же, как и для Edit. Функция 'navGrid' имеет полную форму' jQuery («# grid_id»). JqGrid ('navGrid', '# gridpager', {parameters}, prmEdit, prmAdd, prmDel, prmSearch, prmView); 'где' prmAdd' есть ту же форму, что и «prmEdit», которую я описал в своем ответе. – Oleg

Смежные вопросы