Wie sende ich deaktivierte Eingaben in ASP.NET MVC?

108

Wie sende ich deaktivierte Eingaben in ASP.NET MVC?

Sanchitos
quelle
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.

Darin Dimitrov
quelle
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.

Sanchitos
quelle
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.

DLeh
quelle
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.

Tvanfosson
quelle
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");
Dhaval Pankhaniya
quelle
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
Verwenden Sie OnBegin " msdn.microsoft.com/en-us/library/… "
Dhaval Pankhaniya
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>
Dave
quelle
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 })
Joetinger
quelle
2

Wenn wir mit deaktivierten, aber aktivierten Kontrollkästchen arbeiten und den Wert veröffentlichen möchten, müssen wir sicherstellen, dass unser verstecktes Feld vor dem versteckten Feld @ Html.CheckBoxFor angezeigt wird.

Es folgt der Link, über den ich die Antwort gefunden habe. http://davecallan.com/posting-disabled-checkboxes-mvc-razor-views/#comment-11033

Mitesh Patel
quelle
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
});
Geschmack
quelle
1

Dies hilft beim Senden von Modellwerten in ASP.net:

$("#iD").attr("style", "pointer-events: none;background-color:rgb(220,220,220)");
Rohan
quelle
1
Bitte formatieren Sie Ihre Antwort . Dies macht es für alle lesbarer
Tarick Welling
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)
Mehmet Taha Meral
quelle
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>

Ahmed Mahmoud AbdElbaset
quelle
-3

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

Kuroge
quelle