it-swarm.it

Gli input dei moduli disabilitati non vengono visualizzati nella richiesta

Ho alcuni input disabilitati in un modulo e voglio 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>
276
hazzik

Gli elementi con attributo Disabilitato non vengono inviati o puoi dire che i loro valori non sono pubblicati (vedi il secondo punto elenco sotto il Passaggio 3 in le specifiche per costruire il set di dati del modulo ).

Vale a dire,

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

Cordiali saluti,

  1. I controlli disabilitati non ricevono lo stato attivo.
  2. I controlli disabilitati vengono saltati nella navigazione a schede.
  3. I controlli disabilitati non possono essere pubblicati correttamente.

Puoi utilizzare l'attributo readonly 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,

  1. Gli elementi di sola lettura ricevono il focus ma non possono essere modificati dall'utente.
  2. Gli elementi di sola lettura sono inclusi nella navigazione a schede.
  3. Gli elementi di sola lettura vengono pubblicati correttamente.
623
AlphaMale

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>
22
LipeTuga

Per inserire valori da input disabilitati oltre agli input abilitati, puoi semplicemente riattivare tutti gli input del modulo mentre vengono inviati.

<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, si aggiunge 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 -->
}
6
Tom Blodget

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

6
Chris Pierce

Sto aggiornando questa risposta poiché è molto utile. Basta aggiungere readonly 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>
2
Limon

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

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

Semanticamente questo sembra il comportamento corretto

Mi chiederei " Perché devo inviare questo valore? "

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

Qualsiasi valore visualizzato in un input disabilitato dovrebbe essere

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

Supponendo che il server che elabora il modulo sia lo stesso del server che lo serve, tutte le informazioni per riprodurre i valori degli input disabilitati dovrebbero essere disponibili all'elaborazione

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

Direi quasi che gli input di sola lettura non dovrebbero essere inviati nemmeno nella richiesta 

Felice di essere corretto, ma tutti i casi d'uso Posso pensare a dove gli input di sola lettura/disabilitati devono essere inviati sono davvero solo problemi di stile sotto mentite spoglie

1
Arth