2010-11-29 41 views
1

Tous,ComboBox: Chaîne vide envoyée au POST lorsque son champ valeur est numérique. Comment puis-je passer null au serveur?

Je reçois une exception de conversion lors de la tentative de création d'un nouvel enregistrement via un POST à ​​l'aide du JSONStore d'Extjs. L'exception se produit lorsqu'une chaîne vide est transmise au serveur et que le serveur tente de la convertir en un nombre entier. Le champ valueField de comboBox est défini sur un champ défini par int. Les champs de datastore sont les suivantes:

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' } 
     ], 

la définition combobox est:

{ 
       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' 
      }, 

Le JSONStore utilisé pour envoyer le POST est, assez curieusement, l'envoi de la valeur de la combobox comme une chaîne vide, même bien que j'ai configuré le JSONWriter de ne pas envoyer les champs inchangés:

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

et la valeur POST envoyée au serveur: ....,"secondaryIncidentTypeId":"",... < - remarquez le vide chaîne après les deux points.

Voici le secondaryIncidentTypeArrayStore:

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: [] 
}) 

Je suis sur le point d'écrire un chèque manuel pour une chaîne vide et le mettre à null si la chaîne est vide. Cela semble assez kludgy. Quelle est la bonne façon d'envoyer soit rien de retour ou une valeur nulle au serveur sur le formulaire de soumission?

Merci!

Répondre

1

Qu'est-ce qui se passe est que parce que le type de votre champ id est integer il le force dans un nombre entier. Une valeur falsifiée sera donc 0.

Si vous supprimez le type, aucune conversion ne sera effectuée et l'ID ne sera pas ajouté s'il n'est pas défini.

par exemple.

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: [] 
}) 

Si vous devez envoyer id=null pour obtenir le backend de se comporter d'une façon de traiter avec elle est d'ajouter une coutume Ext.data.Type.

D'autres façons de le résoudre sont également disponibles si aucun de ceux-ci ne vous plaît.

EDIT: Aha! Essayez la propriété allowNull.

+0

J'ai essayé de supprimer la déclaration de type pour les champs de valeur utilisés dans les combos, mais cela n'a eu aucun effet. Créer un type personnalisé est une possibilité, je suis juste surpris que cela ne soit pas déjà géré par le framework. Merci pour votre contribution! –

+0

Edité pour montrer ce que je voulais dire - vous l'avez fait et il a encore converti 'null' en' 0'? – wombleton