49 Stimmen

Model Binding mit deaktiviertem Textfeld

Ich habe ein Textfeld, das ich definiere als

<%= Html.TextBox("Username", Model.Form.Username, 
        new { @class = "textbox", @disabled = "disabled" })%>

Die Aktion ist definiert als

    [AcceptVerbs(HttpVerbs.Post)]
    [ValidateAntiForgeryToken]
    public ActionResult EditLogin(LoginForm post) {

        ...

        return View(model);
    }

Wenn ich POST zu diesem, Username wird leer sein. Alle anderen Eigenschaften werden korrekt gebunden, aber wenn ich die @disabled="disabled" a @readonly="readonly" der Benutzername wird richtig gebunden und alles funktioniert.

Es sieht so aus, als ob die Modellbindung Werte in deaktivierten Feldern ignoriert. Gibt es eine Möglichkeit, dies zu umgehen? Ich brauche immer noch den Wert des Feldes, um an das Modell zu binden. Ich kann readonly verwenden, aber würde es vorziehen, deaktiviert zu verwenden, so dass es visuell offensichtlich für den Benutzer ist, dass sie den Wert des Feldes nicht bearbeiten können.

70voto

John Hartsock Punkte 82122

Ich glaube, dass ein Formularfeld, das deaktiviert ist, nichts übermittelt. Wenn Sie ein Formular haben und das foo-Feld in diesem Formular deaktivieren, wird der Beitrag nicht den Wert für das foo-Feld haben, wenn Sie posten. Dies ist einfach die Art der Deaktivierung eines Feldes in HTML und ist nicht ein MVC Problem.

64voto

vincemcc79 Punkte 601

Utiliser readonly - deaktiviert die Eingabe, aber Sie haben sie immer noch in der Bindung. Sie könnten einen Stil auf das Div anwenden, um es vielleicht ausgegraut aussehen zu lassen?

<div class="editor-label">
  @Html.LabelFor(model => model.FileName)
</div>
<div class="editor-field-greyed-out">
  @Html.TextBoxFor(model => model.FileName, new { @readonly = true })
  @Html.ValidationMessageFor(model => model.FileName)
</div>

5voto

Dan Diplo Punkte 24765

Wenn Sie möchten, dass der Wert zurückgesendet wird, aber nicht bearbeitet werden kann, sollten Sie ihn in ein verborgenes Feld eingeben. Natürlich sollten Sie dies nicht für Dinge tun, die ein gewisses Maß an Sicherheit erfordern, da ein Benutzer sie manipulieren kann.

5voto

Khaled Musaied Punkte 2433

Sie können das Problem umgehen, indem Sie ein verstecktes Feld mit demselben Wert hinzufügen ;)

<%= Html.Hidden("Username", Model.Form.Username)%>

4voto

tony.leo Punkte 91

Wie in den Kommentaren vorgeschlagen, kann readonly anstelle von disabled eine Option sein, aber es wird nicht für Selectboxen funktionieren. Anstatt eine verborgene Eingabe zu erstellen, können Sie die Eingaben oder Auswahlfelder als deaktiviert beibehalten und die Daten trotzdem weitergeben, indem Sie die deaktivierte Eigenschaft mit JavaScript beim Absenden ändern.

Mit jQuery würde es wie folgt aussehen:

$('form').on('submit', function(){
    $('input, select').prop('disabled',false);
    return true;
});

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X