Указание корневого узла FormPanel.form.load для динамических форм - PullRequest
1 голос
/ 24 января 2009

Я создаю динамическую форму ExtJS на основе данных JSON, загруженных из веб-службы ASP.NET. Проблема, которую я нахожу в том, что ExtJS ожидает JSON в определенном формате, т.е.

{ "metaData": { "title": "Testing" }, "data": [], "success": true }

При использовании веб-службы ASP.NET для возврата объекта в виде JSON он возвращается с первым элементом «d», т. Е.

{ "d": { "metaData": { "title": "Testing" }, "data": [], "success": true } }

Можно ли указать форме ExtJS использовать "d" в качестве корневого узла?

Ответы [ 2 ]

2 голосов
/ 25 января 2009

После еще одного тестирования я обнаружил, что форма ExtJS действительно загружает JSON из моего веб-сервиса, но поскольку текст ответа не имеет «success»: true в корне он обрабатывается обработчиком «fail». К счастью, этот обработчик принимает те же параметры, что и обработчик «success», поэтому им можно манипулировать одинаково.

Вот пример моего обработчика загрузки формы:

this.form.load({
  url: "myservice.asmx/getUser",
  headers: {'Content-Type': 'application/json'},
  success: function(form, action) {
    //not fired
  },
  failure: function(form, action){
    if (action.result.d){
      //process data
    }
  }
});
1 голос
/ 30 апреля 2009

Вы, конечно, не должны вызывать form.load (). Я обхожу это и просто вызываю свой веб-метод ASMX напрямую, вызывая функцию AJAX, которая ссылается на мой веб-метод, как это предусмотрено ScriptManager. MS AJAX выполняет все JSON-декодирование, выделяет свойство 'd' и т. Д.

Вашему веб-методу даже не нужно возвращать объект с объектами 'success' и 'data', как того требует form.load (), хотя это полезный формат, и я придерживаюсь его.

С помощью объекта «данные», возвращаемого веб-методом (с парами имя / значение, где имя == имя поля), теперь вы можете вызывать форму ExtJs form.setValues ​​(data); записать значения в поля.

Это вполне допустимый случай для обхода кода ExtJS.

-

Как при загрузке, так и при отправке. Чтобы обойти проблему со свойством 'd' в объекте, который должен быть возвращен веб-методом отправки, обработайте событие click кнопки Submit и отправьте данные на сервер, напрямую вызвав ваш веб-метод. Ваш веб-метод может / должен вернуть объект в том же формате, который требуется ExtJs. Но вы возвращаете этот объект, и если не удалось, вызовите form.markInvalid () самостоятельно, передав свойство 'errors'. Peasy легко и хорошо работает.

Опять же, поскольку ExtJs не очень хорошо работают со свойством d, вполне допустимо обойти его и делать что-то самостоятельно.

-

Я склонен использовать функции ScriptManager для все большего и большего вызова моих веб-методов и обходить AJAX-метод ExtJs, вызывающий код. Первые гораздо проще в использовании, они знают о свойстве 'd', а также знают, как десериализовать формат Microsoft JSON для сериализованных объектов DateTime.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...