Gli input del modulo disabilitati non vengono visualizzati nella richiesta


340

Ho alcuni input disabilitati in un modulo e desidero inviarli a un server, ma Chrome li esclude dalla richiesta.

C'è qualche soluzione per questo senza aggiungere un campo nascosto?

<form action="/Media/Add">
    <input type="hidden" name="Id" value="123" />

    <!-- this does not appear in request -->
    <input type="textbox" name="Percentage" value="100" disabled="disabled" /> 

</form>


2
@Liam è un tentativo molto strano di chiudere a favore delle domande meno frequenti con risposte di qualità inferiore.
hazzik,

Un anziano domanda meno frequentato. Tecnicamente questa domanda dovrebbe essere chiusa come duplicata quando è stata posta. L'ho contrassegnato con una mod per la potenziale fusione, può o meno accadere. Dipende da loro.
Liam,

@Liam infatti le domande sono diverse anche se alcune risposte sembrano simili. Chiedo come rendere il campo "disabilitato" per inviare valori, e un'altra domanda chiede "ragioni"
hazzik

Sono arrivato qui solo dopo aver trascorso alcune ore a cercare di risolverlo. Ehhh ..
matcheek,

Risposte:


730

Gli elementi con l' disabledattributo non vengono inviati oppure puoi dire che i loro valori non sono pubblicati (vedi il secondo punto elenco sotto il passaggio 3 nelle specifiche HTML 5 per la creazione del set di dati del modulo ).

Vale a dire,

<input type="textbox" name="Percentage" value="100" disabled="disabled" /> 

Cordiali saluti, secondo il 17.12.1 nella specifica HTML 4:

  1. I controlli disabilitati non ricevono lo stato attivo.
  2. I controlli disabilitati vengono ignorati nella navigazione delle schede.
  3. I controlli disabilitati non possono essere registrati correttamente.

Puoi usare l' readonlyattributo nel tuo caso, in questo modo sarai in grado di pubblicare i dati del tuo campo.

Vale a dire,

<input type="textbox" name="Percentage" value="100" readonly="readonly" />

Cordiali saluti, secondo il 17.12.2 nella specifica HTML 4:

  1. Gli elementi di sola lettura ricevono lo stato attivo ma non possono essere modificati dall'utente.
  2. Gli elementi di sola lettura sono inclusi nella navigazione delle schede.
  3. Gli elementi di sola lettura vengono pubblicati correttamente.

8
Per rispondere alla mia domanda: No, readony funziona solo per <input /> form control di type = 'text' e type = 'password' e per <textarea />. Ciò che fa di sola lettura è impedire all'utente di modificare il valore dei controlli. Impedire all'utente di modificare il valore di una casella (o input di tipo radio) non ha molto senso ...
Muleskinner,

3
@ danielson317 Puoi mantenere l'elemento di selezione "disabilitato" ma aggiungere anche un altro input nascosto con lo stesso valore.
AlphaMale

1
@AlphaMale Ma l'elemento nascosto non può avere lo stesso nome (o non dovrebbe). Ho superato questo consentendo all'elemento di essere vuoto e semplicemente eliminando il valore originale dallo stato del modulo salvato. Vale la pena notare che in sola lettura non funziona su elementi del modulo selezionato.
danielson317,

2
Hai mai scoperto qualcosa e pensi: "Che diamine li ha fatti pensare che sarebbe ovvio?" Se mi preoccupo di includere un campo di input che può essere disabilitato o meno, ciò significa che non voglio che l' utente lo cambi, non che dovrebbe effettivamente agire come se non fosse mai stato dichiarato!
Nick Bedford,

1
Grazie, questo è stato utile e sia la risposta che la risposta.
user1449249

25

Usando Jquery e inviando i dati con ajax, puoi risolvere il tuo problema:

<script>

$('#form_id').submit(function() {
    $("#input_disabled_id").prop('disabled', false);

    //Rest of code
    })
</script>

+1 il bello di questa soluzione è che puoi ancora usare l'icona di disabilitazione rossa quando l'utente oltre l'ingresso =)
JMASTER B

5
@ArielMaduro puoi farlo con csscursor:not-allowed;
sricks

@sricks oh davvero ?? Puoi fornire un esempio?
JMASTER B,

piace questa soluzione più che utilizzarla in sola lettura, perché i campi disabilitati non possono ricevere lo stato attivo
Andreas

9

Per pubblicare valori da input disabilitati oltre agli input abilitati, è possibile semplicemente riattivare tutti gli input del modulo durante l'invio.

<form onsubmit="this.querySelectorAll('input').forEach(i => i.disabled = false)">
    <!-- Re-enable all input elements on submit so they are all posted, 
         even if currently disabled. -->

    <!-- form content with input elements -->
</form>

Se preferisci jQuery:

<form onsubmit="$(this).find('input').prop('disabled', false)">
    <!-- Re-enable all input elements on submit so they are all posted, 
         even if currently disabled. -->

    <!-- form content with input elements -->
</form>

Per ASP.NET MVC C # Razor, aggiungi il gestore di invio in questo modo:

using (Html.BeginForm("ActionName", "ControllerName", FormMethod.Post,
    // Re-enable all input elements on submit so they are all posted, even if currently disabled.
    new { onsubmit = "this.querySelectorAll('input').forEach(i => i.disabled = false)" } ))
{
    <!-- form content with input elements -->
}

manca una delle citazioni sull'opzione jquery
cagcak,

8

Se devi assolutamente disabilitare il campo e passare i dati, puoi utilizzare un javascript per inserire gli stessi dati in un campo nascosto (o semplicemente impostare anche il campo nascosto). Ciò ti consentirebbe di disabilitarlo ma di pubblicare comunque i dati anche se pubblicheresti su un'altra pagina.


1
Questa soluzione è anche quella che ho usato - ma come ho appena appreso - la proprietà di sola lettura è una soluzione molto migliore
Muleskinner,

4

Sto aggiornando questa risposta poiché è molto utile. Basta aggiungere in sola lettura all'input.

Quindi il modulo sarà:

<form action="/Media/Add">
    <input type="hidden" name="Id" value="123" />
    <input type="textbox" name="Percentage" value="100" readonly/>
</form>

4

Semanticamente questo sembra il comportamento corretto

Mi chiedevo " Perché devo inviare questo valore? "

Se si dispone di un input disabilitato su un modulo, presumibilmente non si desidera che l'utente cambi direttamente il valore

Qualsiasi valore visualizzato in un input disabilitato dovrebbe essere

  1. output da un valore sul server che ha prodotto il modulo, oppure
  2. se il modulo è dinamico, essere calcolabile dagli altri input nel modulo

Supponendo che il server che elabora il modulo sia uguale al server che lo serve, tutte le informazioni per riprodurre i valori degli input disabilitati dovrebbero essere disponibili durante l'elaborazione

In effetti, per preservare l'integrità dei dati, anche se il valore dell'input disabilitato è stato inviato al server di elaborazione, dovresti davvero convalidarlo. Questa convalida richiederebbe lo stesso livello di informazioni di cui avresti bisogno per riprodurre comunque i valori!

Direi quasi che neanche gli input di sola lettura devono essere inviati nella richiesta

Felice di essere corretto, ma tutti i casi d'uso a cui riesco a pensare a dove devono essere inviati input di sola lettura / disabilitati sono in realtà solo problemi di stile sotto mentite spoglie


1
per non dimenticare che il suo valore può essere manipolato direttamente con gli strumenti di sviluppo di Chrome
jimjim

2

Trovo che funzioni più facilmente. solo il campo di input, quindi lo stile in modo che l'utente finale sappia che è di sola lettura. gli input inseriti qui (ad esempio da AJAX) possono comunque essere inviati, senza codice aggiuntivo.

<input readonly style="color: Grey; opacity: 1; ">

-6

Puoi evitare totalmente la disabilitazione, è doloroso dal momento che il formato del modulo html non invierà nulla correlato <p>o qualche altra etichetta.

Quindi puoi invece metterlo regolarmente

<input text tag just before you have `/>

Aggiungi questo readonly="readonly"

Non disabiliterebbe il tuo testo ma non cambierebbe per utente, quindi funziona come <p>e invierà valore attraverso il modulo. Rimuovi il bordo se desideri renderlo più simile al <p>tag

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.