Используя jqgrid, как лучше всего возвращать ошибки проверки на стороне сервера при встроенном редактировании?

Я использую jqgrid и использую режим встроенного редактирования и не может понять, как возвращать ошибки обратно клиенту из правил проверки на стороне сервера

Я использую беглую проверку на своем сервере для проверки перед сохранением в базе данных. Это прекрасно работает, за исключением того, что я не вижу, как возвращать ошибки при редактировании в встроенном режиме. Если я не сохраняю значения в базе данных, клиент все равно показывает значение, которое следует отклонить.

Каков рекомендуемый способ вернуть ошибку после того, как кто-то внесет встроенное редактирование, чтобы вы получили всплывающее окно на стороне клиента, показывающее ошибку, и оно оставалось в состоянии редактирования?


ПРИМЕЧАНИЕ: это изображение ниже является ответом на комментарий Олега и ответ ниже.

введите здесь описание изображения


person leora    schedule 22.01.2012    source источник


Ответы (1)


Рекомендуемый способ — использовать любой код ошибки HTTP в ответе при отправке неправильных данных и возвращать описание ошибки в теле ответа. Если вам нужно какое-то более конкретное действие, такое как отображение другого диалога с информацией об ошибке, установка фокуса на поле, пометка некоторых полей классом CSS 'ui-state-error' или что-то в этом роде, вы должны использовать функцию обратного вызова errorfunc.

Если restoreAfterError равно false, внутреннее редактирование будет продолжено.

ОБНОВЛЕНО: я упоминаю в комментариях, что сервер должен выдавать сообщение об ошибке в качестве ответа. В случае ASP.NET MVC сообщением по умолчанию является текст HTML, который вы разместили в качестве первого изображения. Если вы используете HandleJsonExceptionAttribute, который я описал в моем старом ответе, сообщение об ошибке будет сериализовано как JSON, но оно содержит дополнительную информацию, которая вам не нужно отображать (например, StackTrace). Поэтому вам следует использовать параметр errorfunc editRow или saveRow для декодирования ответа сервера. Вы можете либо использовать decodeErrorMessage из уже упомянутого ответа, либо напрямую использовать функцию $.parseJSON:

errorfunc: function(rowid, res) {
    var errorText = $.parseJSON(res.responseText).Message;
    $.jgrid.info_dialog($.jgrid.errors.errcap,
        '<div class="ui-state-error">' + errorText + '</div>',
        $.jgrid.edit.bClose,
        {buttonalign: 'right'});
}
person Oleg    schedule 22.01.2012
comment
@leora: любая терка кода или равная 400 (см. здесь или здесь). Сам код ошибки не будет отображаться по умолчанию в сообщении об ошибке, отображаемом jqGrid. Будет отображаться только тело ответа. - person Oleg; 22.01.2012
comment
@leora: Если вы используете ASP.NET MVC, например, вы можете просто создать исключение. Можно использовать HandleJsonExceptionAttribute из ответа. Есть много других способов отправить сообщение об ошибке и код состояния ошибки HTTP. - person Oleg; 23.01.2012
comment
этот вид работ, но он дает довольно уродливое всплывающее окно. Я приложил изображение того, что я вижу после добавления исключения. Любые предложения о том, как сделать это лучше? - person leora; 23.01.2012
comment
@leora: Как вы реализовали свою серверную часть? Ваш текущий обработчик исключений создает HTML-ответ с текстом, который вы разместили в качестве изображения. Посмотрите на мой предыдущий комментарий, где я даю ссылку, как можно реализовать чистый ответ JSON. Таким образом, вы можете чисто генерировать текстовый ответ для некоторых исключений. Другим способом является реализация функции обратного вызова errorfunc, которая анализирует HTML, который в настоящее время создает сервер, и отображает только основную часть сообщения об ошибке: «Ян» должен быть меньше 101. - person Oleg; 23.01.2012
comment
я попробовал этот атрибут Json, который вы упомянули, но я все еще вижу все сообщение об ошибке (см. новое изображение, добавленное к вопросу) - person leora; 23.01.2012
comment
@leora: вам следует проанализировать ответ JSON и отобразить только важную часть ответа сервера. См. ОБНОВЛЕННУЮ часть моего ответа. - person Oleg; 23.01.2012