Come si invia un input disabilitato in ASP.NET MVC?


108

Come si invia un input disabilitato in ASP.NET MVC?


3
In genere è necessario formulare la domanda come domanda e quindi pubblicare la risposta separatamente. Votazioni per chiudere; ti consigliamo di spostare la parte "risposta" in una risposta effettiva.
George Stocker,

1
Credo che il post di @Dhaval sia esattamente la risposta a causa della parola disabilitata nella tua domanda.
QMaster

Risposte:


160

Non puoi fare il campo readonly="readonly"invece di disabled="disabled"? Un valore di campo di sola lettura verrà inviato al server pur non essendo modificabile dall'utente. SELECTTuttavia, un tag è un'eccezione.


1
readonly funziona ma non oscura il campo. Ecco un esempio che sto usando: <%: Html.TextBoxFor(model => model.p1, new { @readonly = "readonly" }) %>come posso disattivarlo in modo tale che visivamente sembra che non sia modificabile. Meglio ancora possiamo usare qualcosa di simile a LabelFor, ho provato LabelFor ma ottiene solo DisplayName ....
VoodooChild

22
4 anni facendo .net asp e non ho mai saputo che gli input disabilitati non avessero indietro la posta ... come mi è passato? Basta includere un campo Nascosto per la selezione disabilitata ed è tutto ordinato. (Anche se gli ID vengono ripetuti nel modulo che non è consentito)
Piotr Kula

5
Questo non funziona neanche per gli type="checkbox"input
Nathan

1
Sto cercando di fare la stessa cosa con i pulsanti di opzione ma readonly non sembra funzionare su di essi.
Randy R

38

Grazie a tutti:

Il modo in cui ho risolto questo:

document.getElementById("Costo").readOnly = true;
document.getElementById("Costo").style.color = "#c0c0c0";

Nota:

Ho ricevuto queste informazioni sulla risposta ma sono stato modificato.


1
Questo non ha funzionato per me (l'ho capito grazie a questo link SO ). Ha funzionato: textBox.Attributes.Add("readonly", "readonly");e la spiegazione è nel link
brian-d

È positivo che tu l'abbia modificato perché ha più senso per me.
Yawar

readonly sembra essere la strada da percorrere. Non fa cose strane come non rimettere in posizione il controllo ma non consente di modificarlo. Molte grazie!
Mariusz

Per aggiungere al commento di Michael Brennt, se stai usando jQuery la seconda riga diventa $("#textBoxId").css("color", "#c0c0c0").
F1Krazy

30

@ppumkin lo ha menzionato nel suo commento su questa risposta, ma volevo evidenziarlo perché non sono riuscito a trovare altre risorse sull'invio dei dati da un disabile <select>. Credo anche che sia rilevante per la domanda in quanto le selezioni non sono <input>s ma sono "input".

Basta includere un campo nascosto per la selezione disabilitata ed è tutto ordinato.

Esempio:

@Html.DropDownListFor(model => model.SelectedID, ... , new { disabled = "disabled"}) @* Won't be posted back *@
@Html.HiddenFor(model => model.SelectedID) @* Will be posted back *@

Attenzione: questo metterà due tag sulla pagina con lo stesso ID, che non è veramente HTML valido e potrebbe causare mal di testa con javascript. Per me, ho javascript per impostare il valore del menu a discesa dal suo html id, e se metti prima il campo nascosto, il javascript lo troverà invece del select.


20

In genere, se ho un campo di "sola lettura" ma deve essere reinviato al server, disabiliterò la visualizzazione (o semplicemente testo), ma poi aggiungerò un campo nascosto con lo stesso nome. Devi comunque assicurarti che il campo non sia effettivamente modificato sul lato server - semplicemente non aggiornarlo dal modello nella tua azione - ma lo stato del modello sarà comunque accurato se ci sono errori.


Sì, stavo pensando di fare quello che stai chiedendo. Ma avrei dovuto gestire più variabili. Sto saltellando che potrebbe essere il mio post apparirà su Google e le persone non dovranno soffrire, cercando una soluzione facile.
Sanchitos

4
Un problema con la tua soluzione è che si interrompe se javascript è disabilitato. L'iniezione del lato server del campo nascosto non presenta questo problema.
tvanfosson

15

Puoi anche utilizzare un codice come questo prima che il modulo venga inviato:

$(":disabled", $('#frmMain')).removeAttr("disabled");

2
Ho usato questo, non devo preoccuparmi degli elementi nascosti, non sono sicuro che ci siano degli svantaggi, tranne forse un leggero ritardo nel
postback

2
Contro molte delle risposte che menzionavano l'utilizzo di sola lettura piuttosto disabilitato, credo che in molti casi sia necessario utilizzare disabilitato, ho letto circa 15 risposte in domande simili e ho scelto questo solo con il proprio filtro jQuery per selezionare gli elementi appropriati per rimuovere l'attributo disabilitato, ottimo Grazie.
QMaster

E se invii con Ajax.BeginForm?
markzzz


1
sembra un po 'strano, ma era l'unica soluzione che ha funzionato per me ...
AGuyCalledGerald

8

In base alla progettazione, i browser non lo supportano.

Creali readonlyche consentano di inviare valori al server o se hai a che fare con controlli che sono ancora utilizzabili con readonlyattributi come Seleziona, aggiungi lo stile CSS pointer-events: none;per renderli non interattivi

Una specie di hack, ma funziona! Funziona anche quando invii il modulo direttamente con il pulsante di invio senza utilizzare javascript. Nessun lavoro extra richiesto!

Per esempio:

<select asp-for="TypeId" 
   asp-items="@(new SelectList(await TypeRepository.FetchTypesAsync(), "TypeId", "Name"))"
   class="form-control form-control-sm" 
   readonly 
   style="pointer-events: none;">
</select>

6

Puoi creare un modello di editor come quello qui sotto

CSS

.disabled {
    background-color:lightgray;
}

Modello di editor

@model string
@Html.TextBoxFor(x => x,new {@class="disabled", @readonly=true })


1

espansione di Tasos '(": disabled", $ (' # xxxForm ')). removeAttr ("disabled"); Puoi usare:

$("#xxxForm").submit(function (e) {
    e.preventDefault();
    var form = this;
    $('#Field1')[0].disabled = false;
    $('#Field2')[0].disabled = false;
    ...
    $('#FieldN')[0].disabled = false;
    form.submit(); // submit bypassing the jQuery bound event
});

1

Ciò aiuterà a inviare i valori del modello in ASP.net:

$("#iD").attr("style", "pointer-events: none;background-color:rgb(220,220,220)");

1
Si prega di formattare la risposta . questo lo rende più leggibile per tutti
Tarick Welling,

0

Di solito uso questo modo per CheckBox o CheckBoxFor perché disabilitarlo sta causando la perdita del valore. Sola lettura non funziona nemmeno sulla casella di controllo.

@Html.DisplayFor(m => m.Order.Transfer)
@Html.HiddenFor(m => m.Order.Transfer)

0

Metti semplicemente questo script negli script @section nella tua pagina. questo abiliterà gli input quando invii la pagina e dovresti reindirizzare l'utente a un'altra pagina dopo l'invio.

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.0/jquery.min.js">
$("form").submit(function () {
                    if ($('form').valid()) {
                        $("input").removeAttr("disabled");
                    }
                });
</script>


-3

Basta impostare quella proprietà [Obbligatorio] nel ViewModel collegato a quella vista.

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.