Wie sende ich deaktivierte Eingaben in ASP.NET MVC?


108

Wie sende ich deaktivierte Eingaben in ASP.NET MVC?


3
Im Allgemeinen müssen Sie Ihre Frage als Frage formulieren und die Antwort dann separat veröffentlichen. Abstimmung zum Schließen; empfehlen, den Teil "Antwort" in eine tatsächliche Antwort zu verschieben.
George Stocker

1
Ich glaube, @ Dhaval Post ist genau die Antwort wegen des deaktivierten Wortes in Ihrer Frage.
QMaster

Antworten:


160

Kannst du nicht das Feld machen readonly="readonly"anstatt disabled="disabled"? Ein schreibgeschützter Feldwert wird an den Server gesendet, während er vom Benutzer nicht bearbeitet werden kann. Ein SELECTTag ist jedoch eine Ausnahme.


1
schreibgeschützt funktioniert, aber das Feld wird nicht ausgegraut. Hier ist ein Beispiel, das ich verwende: <%: Html.TextBoxFor(model => model.p1, new { @readonly = "readonly" }) %>Wie kann ich es so grau ausgrauen, dass es so aussieht, als ob es nicht bearbeitet werden kann? Besser noch können wir etwas ähnliches wie LabelFor verwenden, ich habe LabelFor ausprobiert, aber es bekommt nur den DisplayName ....
VoodooChild

22
4 Jahre mit .net asp und ich wusste nie, dass deaktivierte Eingaben nicht zurückgeschickt werden ... wie ist mir das passiert? Fügen Sie einfach ein verstecktes Feld für die deaktivierte Auswahl hinzu und sortieren Sie alles (obwohl die IDs auf dem Formular wiederholt werden, das nicht zulässig ist)
Piotr Kula

5
Dies funktioniert auch nicht für type="checkbox"Eingaben
Nathan

1
Ich versuche das Gleiche mit Optionsfeldern zu tun, aber schreibgeschützt scheint nicht darauf zu funktionieren.
Randy R

38

Danke an alle:

So habe ich das gelöst:

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

Hinweis:

Ich habe diese Informationen auf der Antwort erhalten, aber ich wurde bearbeitet.


1
Das hat bei mir nicht ganz funktioniert (habe es dank dieses SO-Links herausgefunden ). Das hat funktioniert: textBox.Attributes.Add("readonly", "readonly");und die Erklärung ist im Link
Brian-d

Gut, dass Sie es bearbeitet haben, da dies für mich sinnvoller ist.
Yawar

readonly scheint der richtige Weg zu sein. Es macht keine seltsamen Dinge wie das Zurücksetzen des Steuerelements, erlaubt aber nicht, es zu bearbeiten. Vielen Dank!
Mariusz

Wenn Sie jQuery verwenden, wird die zweite Zeile zu Michael Brennts Kommentar $("#textBoxId").css("color", "#c0c0c0").
F1Krazy

30

@ppumkin erwähnte dies in seinem Kommentar zu dieser Antwort, aber ich wollte es hervorheben, da ich keine anderen Ressourcen zum Senden von Daten von einem Behinderten finden konnte <select>. Ich glaube auch, dass es für die Frage relevant ist, da Auswahl nicht <input>s ist, sondern "Eingabe".

Fügen Sie einfach ein ausgeblendetes Feld für die deaktivierte Auswahl hinzu und sortieren Sie alles.

Beispiel:

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

Achtung: Dadurch werden zwei Tags mit derselben ID auf die Seite gesetzt. Dies ist kein wirklich gültiger HTML-Code und kann mit Javascript Kopfschmerzen verursachen. Für mich habe ich Javascript, um den Wert des Dropdowns durch sein HTML festzulegen id, und wenn Sie das versteckte Feld an die erste Stelle setzen, wird das Javascript dies anstelle des finden select.


20

Wenn ich ein Feld habe, das "schreibgeschützt" ist, aber an den Server zurückgesendet werden muss, deaktiviere ich normalerweise die Anzeige (oder einfach nur Text), füge dann aber ein verstecktes Feld mit demselben Namen hinzu. Sie müssen weiterhin sicherstellen, dass das Feld auf der Serverseite nicht tatsächlich geändert wird - aktualisieren Sie es in Ihrer Aktion nur nicht über das Modell -, aber der Modellstatus ist bei Fehlern weiterhin korrekt.


Ja, ich habe darüber nachgedacht, das zu tun, was du vorschlägst. Aber ich müsste mit mehr Variablen umgehen. Ich hoffe, dass mein Beitrag in Google erscheint und die Leute nicht leiden müssen, um nach einer einfachen Lösung zu suchen.
Sanchitos

4
Ein Problem mit Ihrer Lösung ist, dass es kaputt geht, wenn Javascript deaktiviert ist. Das Injizieren des versteckten Felds serverseitig hat dieses Problem nicht.
Tvanfosson

15

Sie können auch Code wie diesen verwenden, bevor das Formular gesendet wird:

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

2
Ich habe dies verwendet, muss mich nicht um versteckte Elemente kümmern, bin mir nicht sicher, ob es irgendwelche Nachteile gibt, außer vielleicht einer leichten Verzögerung beim Zurücksenden aufgrund der js-Funktion
IronHide

2
Gegen viele der Antworten, die über die Verwendung von schreibgeschützt und eher deaktiviert erwähnt wurden, glaube ich, dass wir in vielen Fällen deaktiviert verwenden müssen. Ich habe ungefähr 15 Antworten in ähnlichen Fragen gelesen und dies nur mit einem eigenen jQuery-Filter ausgewählt, um geeignete Elemente zum Entfernen des deaktivierten Attributs auszuwählen Vielen Dank.
QMaster

Was ist, wenn Sie mit einreichen Ajax.BeginForm?
Markzzz


1
sieht ein wenig seltsam aus, aber es war die einzige Lösung, die für mich funktioniert hat ...
AGuyCalledGerald

8

Browser unterstützen dies von Natur aus nicht.

Erstellen Sie sie entweder, um readonlyWerte an den Server zu senden, oder readonlyfügen Sie einen CSS-Stil hinzu pointer-events: none;, wenn Sie mit Steuerelementen arbeiten, die noch mit Attributen wie Select verwendet werden können, um sie nicht interaktiv zu machen

Eine Art Hack, funktioniert aber! Dies funktioniert auch, wenn Sie ein Formular direkt mit der Schaltfläche "Senden" senden, ohne Javascript zu verwenden. Keine zusätzliche Arbeit erforderlich!

Z.B:

<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

Sie können eine Editorvorlage wie die folgende erstellen

CSS

.disabled {
    background-color:lightgray;
}

Editor-Vorlage

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


1

Erweitern von Tasos '(": disabled", $ (' # xxxForm ')). removeAttr ("disabled"); Sie können verwenden:

$("#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
});


0

Normalerweise verwende ich diese Methode für CheckBox oder CheckBoxFor, da das Deaktivieren dazu führt, dass der Wert verloren geht. Readonly funktioniert auch nicht mit Kontrollkästchen.

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

0

Fügen Sie dieses Skript einfach in @section-Skripte auf Ihrer Seite ein. Dadurch werden Eingaben aktiviert, wenn Sie die Seite senden, und Sie sollten den Benutzer nach dem Senden auf eine andere Seite umleiten.

<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

Machen Sie einfach diese Eigenschaft [Erforderlich] im ViewModel, das mit dieser Ansicht verknüpft ist.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.