198 votes

Comment s'assurer qu'un champ de formulaire <select> est soumis lorsqu'il est désactivé ?

J'ai un select Je veux marquer un champ de formulaire comme étant "en lecture seule", c'est-à-dire que l'utilisateur ne peut pas modifier la valeur, mais celle-ci est quand même soumise avec le formulaire. En utilisant l'option disabled empêche l'utilisateur de modifier la valeur, mais ne soumet pas la valeur avec le formulaire.

Le site readonly est uniquement disponible pour input et textarea mais c'est en gros ce que je veux. Y a-t-il un moyen de le faire fonctionner ?

Voici deux possibilités que j'envisage :

  • Au lieu de désactiver le select pour désactiver tous les option et utilisez le CSS pour griser la sélection afin de donner l'impression qu'elle est désactivée.
  • Ajoutez un gestionnaire d'événement de clic au bouton d'envoi pour qu'il active tous les menus déroulants désactivés avant d'envoyer le formulaire.

2 votes

Désolé d'intervenir tardivement, mais les solutions fournies par @ trafalmadorian c'est ce qui marche le mieux. Il désactive toutes les entrées qui ne sont pas sélectionnées. Cela fonctionnerait également si la sélection avait plusieurs options activées. $('#toSelect')find(':not(:selected)').prop('disabled',true);

0 votes

Vous pouvez également laisser le contrôle désactivé sur l'interface utilisateur, mais récupérer la valeur dans la méthode d'action : public ActionResult InsertRecord(MyType model) { if (model.MyProperty == null) { model.MyProperty = Request["MyProperty"] ; } }. }

237voto

Tres Points 2902

Désactivez les champs, puis activez-les avant de soumettre le formulaire :

Code jQuery :

jQuery(function ($) {        
  $('form').bind('submit', function () {
    $(this).find(':input').prop('disabled', false);
  });
});

2 votes

C'est celui que j'ai choisi, principalement parce qu'il est le moins encombrant.

3 votes

La documentation de jQuery recommande d'utiliser .prop et .removeProp pour les éléments "coché", "sélectionné" et "désactivé" au lieu de .attr et .removeAttr. voir http://api.jquery.com/prop/

0 votes

Cela devrait être la réponse acceptée. Beaucoup plus propre et moins gênante.

127voto

Jordan S. Jones Points 7724
<select disabled="disabled">
    ....
</select>
<input type="hidden" name="select_name" value="selected value" />

select_name est le nom que vous donneriez normalement à l <select> .

Une autre option.

<select name="myselect" disabled="disabled">
    <option value="myselectedvalue" selected="selected">My Value</option>
    ....
</select>
<input type="hidden" name="myselect" value="myselectedvalue" />

J'ai remarqué que, selon le serveur Web que vous utilisez, vous devrez peut-être mettre l'option hidden soit avant, soit après l'entrée <select> .

Si ma mémoire est bonne, avec IIS, vous le mettez avant, avec Apache vous le mettez après. Comme toujours, les tests sont essentiels.

0 votes

Ça semble être la seule option viable. Si vous utilisez jQuery ou javascript, vous pouvez essayer d'ajouter la valeur lors de la soumission dans un gestionnaire de soumission.

4 votes

Comment cela pourrait-il dépendre du web serveur ? N'est-ce pas le client qui rend la page avec le champ de sélection, et donc en cas de conflit comme celui-là, ce serait la méthode client qui décide d'envoyer la valeur au serveur ou non ?

9 votes

Cela dépend de la manière dont le serveur traite les entrées multiples portant le même nom.

13voto

J'ai cherché une solution pour cela, et comme je n'ai pas trouvé de solution dans ce fil, j'ai fait le mien.

// With jQuery
$('#selectbox').focus(function(e) {
    $(this).blur();
});

C'est simple, il suffit de brouiller le champ lorsque vous vous concentrez dessus, un peu comme si vous le désactiviez, mais vous envoyez réellement ses données.

0 votes

Wow Une solution simple et efficace. Merci. +1 de ma part :)

0 votes

J'aime beaucoup cela... selon les interactions dans mon formulaire, les éléments sont activés/désactivés dans les deux sens... comment réactiver un champ "flou" dans ce scénario ?

0 votes

D'après Google, il semblerait que $('#selectbox').off('focus') ; permette de réactiver la fonction.

6voto

Marco Demaio Points 8667

Même solution que celle proposée par Tres sans utiliser jQuery

<form onsubmit="document.getElementById('mysel').disabled = false;" action="..." method="GET">

   <select id="mysel" disabled="disabled">....</select>

   <input name="submit" id="submit" type="submit" value="SEND FORM">
</form>

Cela pourrait aider quelqu'un à mieux comprendre, mais c'est évidemment moins flexible que celui de jQuery.

0 votes

Mais, ce n'est pas agréable pour les sélecteurs multiples. Nous pouvons peut-être utiliser getElementsByTagName('select') ?

5voto

Aleks Points 41

J'utilise le code suivant pour désactiver les options dans les sélections

<select class="sel big" id="form_code" name="code" readonly="readonly">
   <option value="user_played_game" selected="true">1 Game</option>
   <option value="coins" disabled="">2 Object</option>
   <option value="event" disabled="">3 Object</option>
   <option value="level" disabled="">4 Object</option>
   <option value="game" disabled="">5 Object</option>
</select>

// Disable selection for options
$('select option:not(:selected)').each(function(){
 $(this).attr('disabled', 'disabled');
});

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X