ComboBox: пустая строка, отправляемая на POST, когда значение valueField является числовым. Как я могу передать ноль на сервер? - PullRequest
1 голос
/ 29 ноября 2010

All

Я получаю исключение приведения при попытке создать новую запись через POST, используя Extjs 'JSONStore. Исключение происходит, когда на сервер передается пустая строка, и сервер пытается преобразовать ее в целое число. Значение valueField comboBox устанавливается в поле, определенное int. Поля хранилища данных:

  fields: [
            { name: 'id', type: 'int' },
            { name: 'displayOrder', mapping: 'displayOrder', type: 'int' },
            { name: 'displayName', mapping: 'displayName', type: 'string' },
            { name: 'enabled', mapping: 'enabled', type: 'boolean' },
            { name: 'letterCode', mapping: 'letterCode', type: 'string' }
        ],

определение поля со списком:

 {
                xtype: 'combo',
                id:"secondaryIncidentCombo",
                hiddenName: 'secondaryIncidentTypeId',
                forceSelection: true,
                width:"200",
                selectOnFocus: true,
                emptyText: 'Secondary Incident',
                editable: false,
                mode: 'local',
                displayField:   'displayName',
                valueField:     'id',
                store: this.secondaryIncidentTypeArrayStore,
                triggerAction: 'all'
            },

JSONStore, используемый для отправки POST, как ни странно, отправляет значение поля со списком в виде пустой строки, хотя я настроил JSONWriter так, чтобы он не отправлял неизмененные поля:

 writer: new Ext.data.JsonWriter({
            encode: false,   
            writeAllFields:false
        }),

И значение POST, отправленное на сервер: ....,"secondaryIncidentTypeId":"",... <- обратите внимание на пустую строку после двоеточия. </p>

Вот вторичныйIncidentTypeArrayStore:

    secondaryIncidentTypeArrayStore: new Ext.data.ArrayStore({
    idProperty: 'id',
    fields: [
        { name: 'id', mapping: 'id', type: 'int' },
        { name: 'displayOrder', mapping: 'displayOrder', type: 'int' },
        { name: 'displayName', mapping: 'displayName', type: 'string' },
        { name: 'enabled', mapping: 'enabled', type: 'boolean' },
        { name: 'letterCode', mapping: 'letterCode', type: 'string' }
    ],
    data: []
})

Я на грани написания ручной проверки на наличие пустой строки и установки ее на ноль, если строка пустая. Это выглядит довольно глупо. Как правильно отправить обратно либо пустое значение, либо пустое значение на сервер при отправке формы?

Спасибо!

1 Ответ

1 голос
/ 30 ноября 2010

Что происходит, так как тип вашего поля id равен integer, оно приводит его к целому числу.Поэтому ложное значение будет 0.

. Если вы удалите тип, он не будет выполнять никаких преобразований и не добавит идентификатор, когда он не определен.

например,

new Ext.data.ArrayStore({
  idProperty: 'id',
  fields: [
    { name: 'id', mapping: 'id' },
    { name: 'displayOrder', mapping: 'displayOrder', type: 'int' },
    { name: 'displayName', mapping: 'displayName', type: 'string' },
    { name: 'enabled', mapping: 'enabled', type: 'boolean' },
    { name: 'letterCode', mapping: 'letterCode', type: 'string' }
  ],
  data: []
})

Если вам нужно отправить id=null, чтобы заставить бэкэнд вести себя, то один из способов справиться с ним - добавить пользовательский Ext.data.Type.

Другие способырешить ее также можно, если ни один из них не понравится.

РЕДАКТИРОВАТЬ: Ага!Попробуйте свойство allowNull.

...